diff options
Diffstat (limited to 'src/htsname.c')
-rw-r--r-- | src/htsname.c | 420 |
1 files changed, 245 insertions, 175 deletions
diff --git a/src/htsname.c b/src/htsname.c index 2df0c98..56fa6a6 100644 --- a/src/htsname.c +++ b/src/htsname.c @@ -53,7 +53,7 @@ Please visit our Website: http://www.httrack.com { /* ajout nom */\ char buff[HTS_URLMAXSIZE*2];\ buff[0]='\0';\ - strncat(buff,start_pos,(int) (nom_pos - start_pos));\ + strncatbuff(buff,start_pos,(int) (nom_pos - start_pos));\ url_savename_addstr(save,buff);\ } @@ -83,6 +83,10 @@ static const char *hts_tbdev[] = // système intelligent, qui renomme en cas de besoin (exemple: deux INDEX.HTML et index.html) int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_adr,char* former_fil,char* referer_adr,char* referer_fil,httrackp* opt,lien_url** liens,int lien_tot,lien_back* back,int back_max,cache_back* cache,hash_struct* hash,int ptr,int numero_passe) { char newfil[HTS_URLMAXSIZE*2]; /* ="" */ + /*char normadr_[HTS_URLMAXSIZE*2];*/ + char normfil_[HTS_URLMAXSIZE*2]; + char* normadr; + char* normfil; char* fil; char* adr; char* print_adr; @@ -111,11 +115,25 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a save[0]='\0'; // fil fil = fil_complete; + // copy of fil, used for lookups (see urlhack) + normfil = fil; // et adr (sauter user/pass) // on prend le parti de mettre les fichiers avec login/pass au même endroit que si ils // étaient capturés sans ces paramètres // c'est pour cette raison qu'on ignore totalement adr_complete (même pour la recherche en table de hachage) - adr=jump_identification(adr_complete); + adr = jump_identification(adr_complete); + // copy of adr, used for lookups (see urlhack) + normadr = adr; + + // normalize the URL: + // www.foo.com -> foo.com + // www-42.foo.com -> foo.com + // foo.com/bar//foobar -> foo.com/bar/foobar + if (opt->urlhack) { + // copy of adr (withiotu protocol), used for lookups (see urlhack) + normadr=jump_normalized(adr); + normfil=fil_normalized(fil,normfil_); + } // à afficher sans ftp:// print_adr=jump_protocol(adr); @@ -123,7 +141,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // court-circuit pour lien primaire if (strnotempty(adr)==0) { if (strcmp(fil,"primary")==0) { - strcat(save,"primary.html"); + strcatbuff(save,"primary.html"); return 0; } } @@ -136,43 +154,43 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a int i; #if HTS_HASH - i=hash_read(hash,adr,fil_complete,1); // recherche table 1 (adr+fil) + i=hash_read(hash,normadr,normfil,1,opt->urlhack); // recherche table 1 (adr+fil) if (i>=0) { // ok, trouvé - strcpy(save,liens[i]->sav); + strcpybuff(save,liens[i]->sav); return 0; } - i=hash_read(hash,adr,fil_complete,2); // recherche table 2 (former_adr+former_fil) + i=hash_read(hash,normadr,normfil,2,opt->urlhack); // recherche table 2 (former_adr+former_fil) if (i>=0) { // ok, trouvé // copier location moved! - strcpy(adr_complete,liens[i]->adr); - strcpy(fil_complete,liens[i]->fil); + strcpybuff(adr_complete,liens[i]->adr); + strcpybuff(fil_complete,liens[i]->fil); // et save - strcpy(save,liens[i]->sav); // copier (formé à partir du nouveau lien!) + strcpybuff(save,liens[i]->sav); // copier (formé à partir du nouveau lien!) return 0; } #else for(i=lien_tot-1;i>=0;i--) { #if HTS_CASSE - if ((strcmp(liens[i]->adr,adr)==0) && (strcmp(liens[i]->fil,fil_complete)==0)) + if ((strcmp(liens[i]->adr,normadr)==0) && (strcmp(liens[i]->fil,normfil)==0)) #else - if ((strfield2(liens[i]->adr,adr)) && (strfield2(liens[i]->fil,fil_complete))) + if ((strfield2(liens[i]->adr,normadr)) && (strfield2(liens[i]->fil,normfil))) #endif { // ok c'est le même lien, adresse déja définie - strcpy(save,liens[i]->sav); + strcpybuff(save,liens[i]->sav); return 0; } if (liens[i]->former_adr) { // tester ancienne loc? #if HTS_CASSE - if ((strcmp(liens[i]->former_adr,adr)==0) && (strcmp(liens[i]->former_fil,fil_complete)==0)) + if ((strcmp(liens[i]->former_adr,normadr)==0) && (strcmp(liens[i]->former_fil,normfil)==0)) #else - if ((strfield2(liens[i]->former_adr,adr)) && (strfield2(liens[i]->former_fil,fil_complete))) + if ((strfield2(liens[i]->former_adr,normadr)) && (strfield2(liens[i]->former_fil,normfil))) #endif { // copier location moved! - strcpy(adr_complete,liens[i]->adr); - strcpy(fil_complete,liens[i]->fil); + strcpybuff(adr_complete,liens[i]->adr); + strcpybuff(fil_complete,liens[i]->fil); // et save - strcpy(save,liens[i]->sav); // copier (formé à partir du nouveau lien!) + strcpybuff(save,liens[i]->sav); // copier (formé à partir du nouveau lien!) return 0; } } @@ -182,20 +200,20 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // chercher sans / ou avec / dans former { char fil_complete_patche[HTS_URLMAXSIZE*2]; - strcpy(fil_complete_patche,fil_complete); + strcpybuff(fil_complete_patche,normfil); // Version avec ou sans / if (fil_complete_patche[strlen(fil_complete_patche)-1]=='/') fil_complete_patche[strlen(fil_complete_patche)-1]='\0'; else - strcat(fil_complete_patche,"/"); + strcatbuff(fil_complete_patche,"/"); #if HTS_HASH - i=hash_read(hash,adr,fil_complete_patche,2); // recherche table 2 (former_adr+former_fil) + i=hash_read(hash,normadr,fil_complete_patche,2,opt->urlhack); // recherche table 2 (former_adr+former_fil) if (i>=0) { // écraser fil et adr (pas former_fil?????) - strcpy(adr_complete,liens[i]->adr); - strcpy(fil_complete,liens[i]->fil); + strcpybuff(adr_complete,liens[i]->adr); + strcpybuff(fil_complete,liens[i]->fil); // écrire save - strcpy(save,liens[i]->sav); + strcpybuff(save,liens[i]->sav); return 0; } #else @@ -203,16 +221,16 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a for(i=lien_tot-1;i>=0;i--) { if (liens[i]->former_adr) { // former-adr? #if HTS_CASSE - if ((strcmp(liens[i]->former_adr,adr)==0) && (strcmp(liens[i]->former_fil,fil_complete_patche)==0)) + if ((strcmp(liens[i]->former_adr,normadr)==0) && (strcmp(liens[i]->former_fil,fil_complete_patche)==0)) #else - if ((strfield2(liens[i]->former_adr,adr)) && (strfield2(liens[i]->former_fil,fil_complete_patche))) + if ((strfield2(liens[i]->former_adr,normadr)) && (strfield2(liens[i]->former_fil,fil_complete_patche))) #endif { // ok c'est le même lien, adresse déja définie // écraser fil et adr (pas former_fil?????) - strcpy(adr_complete,liens[i]->adr); - strcpy(fil_complete,liens[i]->fil); + strcpybuff(adr_complete,liens[i]->adr); + strcpybuff(fil_complete,liens[i]->fil); // écrire save - strcpy(save,liens[i]->sav); + strcpybuff(save,liens[i]->sav); return 0; } } @@ -228,14 +246,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char* a; a=strchr(fil,'?'); if (a!=NULL) { - strncat(newfil,fil,(int) (a - fil)); + strncatbuff(newfil,fil,(int) (a - fil)); } else { - strcpy(newfil,fil); + strcpybuff(newfil,fil); } fil=newfil; } // décoder % - strcpy(fil,unescape_http(fil)); + strcpybuff(fil,unescape_http(fil)); /* { char tempo[HTS_URLMAXSIZE*2]; @@ -249,7 +267,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a tempo[j++]=fil[i]; } tempo[j++]='\0'; - strcpy(fil,tempo); + strcpybuff(fil,tempo); } */ @@ -261,7 +279,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a (strcmp(get_ext(fil),"html") != 0) && (strcmp(get_ext(fil),"htm") != 0) ) { - strcpy(ext,"html"); + strcpybuff(ext,"html"); ext_chg=1; } break; @@ -285,14 +303,15 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // si option check_type activée if ((opt->check_type) && (!ext_chg)) { + int ishtest; if ( (!strfield(adr_complete,"file://")) && (!strfield(adr_complete,"ftp://")) ) { // tester type avec requète HEAD si on ne connait pas le type du fichier if (!( (opt->check_type==1) && (fil[strlen(fil)-1]=='/') )) // slash doit être html? - if (ishtml(fil)<0) { // on ne sait pas si c'est un html ou un fichier.. + if ((ishtest=ishtml(fil)) < 0) { // on ne sait pas si c'est un html ou un fichier.. // lire dans le cache - htsblk r = cache_read(opt,cache,adr,fil,NULL); // test uniquement + htsblk r = cache_read(opt,cache,adr,fil,NULL,NULL); // test uniquement if (r.statuscode != -1) { // pas d'erreur de lecture cache char s[16]; s[0]='\0'; if ( (opt->debug>1) && (opt->log!=NULL) ) { @@ -301,13 +320,13 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } if (strnotempty(r.cdispo)) { /* filename given */ ext_chg=2; /* change filename */ - strcpy(ext,r.cdispo); + strcpybuff(ext,r.cdispo); } - else if (!may_unknown(r.contenttype)) { // on peut patcher à priori? + else if (!may_unknown(r.contenttype) || ishtest == -2) { // on peut patcher à priori? give_mimext(s,r.contenttype); // obtenir extension if (strnotempty(s)>0) { // on a reconnu l'extension ext_chg=1; - strcpy(ext,s); + strcpybuff(ext,s); } } // @@ -326,21 +345,25 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a fspc(opt->log,"debug"); fprintf(opt->log,"Testing link type %s%s"LF,adr_complete,fil_complete); test_flush; } - strcpy(curr_adr,adr_complete); - strcpy(curr_fil,fil_complete); + strcpybuff(curr_adr,adr_complete); + strcpybuff(curr_fil,fil_complete); // ajouter dans le backing le fichier en mode test // savename: rien car en mode test if (back_add(back,back_max,opt,cache,curr_adr,curr_fil,BACK_ADD_TEST,referer_adr,referer_fil,1,NULL)!=-1) { int b; b=back_index(back,back_max,curr_adr,curr_fil,BACK_ADD_TEST); if (b>=0) { + int stop_looping=0; int petits_tours=0; int get_test_request=0; // en cas de bouclage sur soi même avec HEAD, tester avec GET.. parfois c'est la cause des problèmes do { // temps à attendre, et remplir autant que l'on peut le cache (backing) - if (back[b].status>0) back_wait(back,back_max,opt,cache,0); - if (ptr>=0) + if (back[b].status>0) { + back_wait(back,back_max,opt,cache,0); + } + if (ptr>=0) { back_fillmax(back,back_max,opt,cache,liens,ptr,numero_passe,lien_tot); + } // on est obligé d'appeler le shell pour le refresh.. #if HTS_ANALYSTE @@ -359,8 +382,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (!hts_htmlcheck_loop(back,back_max,b,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { return -1; - } else if (_hts_cancel) { // cancel 2 ou 1 (cancel parsing) - back_delete(back,b); // cancel test + } else if (_hts_cancel || !back_checkmirror(opt)) { // cancel 2 ou 1 (cancel parsing) + back_delete(opt,back,b); // cancel test + stop_looping = 1; } } #endif @@ -378,7 +402,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char mov_url[HTS_URLMAXSIZE*2],mov_adr[HTS_URLMAXSIZE*2],mov_fil[HTS_URLMAXSIZE*2]; mov_url[0]=mov_adr[0]=mov_fil[0]='\0'; // - strcpy(mov_url,back[b].r.location); // copier URL + strcpybuff(mov_url,back[b].r.location); // copier URL if (ident_url_relatif(mov_url,curr_adr,curr_fil,mov_adr,mov_fil)>=0) { // si non bouclage sur soi même, ou si test avec GET non testé if ((strcmp(mov_adr,curr_adr)) || (strcmp(mov_fil,curr_fil)) || (get_test_request==0)) { @@ -389,8 +413,8 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // recopier former_adr/fil? if ((former_adr) && (former_fil)) { if (strnotempty(former_adr)==0) { // Pas déja noté - strcpy(former_adr,curr_adr); - strcpy(former_fil,curr_fil); + strcpybuff(former_adr,curr_adr); + strcpybuff(former_fil,curr_fil); } } @@ -400,25 +424,25 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a robots_wizard* robots = (robots_wizard*) opt->robotsptr; if (hts_acceptlink(opt,ptr,lien_tot,liens, mov_adr,mov_fil, - opt->filters.filters,opt->filters.filptr,opt->maxfilter, - robots, &set_prio_to, NULL) == 1) { /* forbidden */ has_been_moved = 1; - back_delete(back,b); // ok - strcpy(curr_adr,mov_adr); - strcpy(curr_fil,mov_fil); + back_maydelete(opt,back,b); // ok + strcpybuff(curr_adr,mov_adr); + strcpybuff(curr_fil,mov_fil); mov_url[0]='\0'; + stop_looping = 1; } } // ftp: stop! if (strfield(mov_url,"ftp://")) { // ftp, ok on arrête has_been_moved = 1; - back_delete(back,b); // ok - strcpy(curr_adr,mov_adr); - strcpy(curr_fil,mov_fil); + back_maydelete(opt,back,b); // ok + strcpybuff(curr_adr,mov_adr); + strcpybuff(curr_fil,mov_fil); + stop_looping = 1; } else if (*mov_url) { char* methode; if (!get_test_request) @@ -438,9 +462,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } // libérer emplacement backing actuel et attendre le prochain - back_delete(back,b); - strcpy(curr_adr,mov_adr); - strcpy(curr_fil,mov_fil); + back_maydelete(opt,back,b); + strcpybuff(curr_adr,mov_adr); + strcpybuff(curr_fil,mov_fil); b=back_index(back,back_max,curr_adr,curr_fil,methode); if (!get_test_request) has_been_moved = 1; // sinon ne pas forcer has_been_moved car non déplacé @@ -470,21 +494,20 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } } // ok, leaving } - - } while(back[b].status>0); + } while(!stop_looping && back[b].status > 0 && back[b].status < 1000); // Si non déplacé, forcer type? if (!has_been_moved) { if (back[b].r.statuscode!=-10) { // erreur if (strnotempty(back[b].r.contenttype)==0) - strcpy(back[b].r.contenttype,"text/html"); // message d'erreur en html + strcpybuff(back[b].r.contenttype,"text/html"); // message d'erreur en html // Finalement on, renvoie un erreur, pour ne toucher à rien dans le code // libérer emplacement backing /*if (opt->errlog!=NULL) { fspc(opt->errlog,0); fprintf(opt->errlog,"Error: (during prefetch) %s (%d) to link %s at %s%s"LF,back[b].r.msg,back[b].r.statuscode,back[b].r.location,curr_adr,curr_fil); test_flush; } - back_delete(back,b); + back_delete(opt,back,b); return -1; // ERREUR (404 par exemple) */ } @@ -494,13 +517,13 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a s[0]='\0'; if (strnotempty(back[b].r.cdispo)) { /* filename given */ ext_chg=2; /* change filename */ - strcpy(ext,back[b].r.cdispo); + strcpybuff(ext,back[b].r.cdispo); } - else if ((!may_unknown(back[b].r.contenttype)) || (!get_ext(back[b].url_fil)) ) { // on peut patcher à priori? (pas interdit ou pas de type) + else if (!may_unknown(back[b].r.contenttype) || ishtest == -2 ) { // on peut patcher à priori? (pas interdit ou pas de type) give_mimext(s,back[b].r.contenttype); // obtenir extension if (strnotempty(s)>0) { // on a reconnu l'extension ext_chg=1; - strcpy(ext,s); + strcpybuff(ext,s); } } } @@ -508,14 +531,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // FIN Si non déplacé, forcer type? // libérer emplacement backing - back_delete(back,b); + back_maydelete(opt,back,b); // --- --- --- // oops, a été déplacé.. on recalcule en récursif (osons!) if (has_been_moved) { // copier adr, fil (optionnel, mais sinon marche pas pour le rip) - strcpy(adr_complete,curr_adr); - strcpy(fil_complete,curr_fil); + strcpybuff(adr_complete,curr_adr); + strcpybuff(fil_complete,curr_fil); // copier adr, fil return url_savename(curr_adr,curr_fil,save,NULL,NULL,referer_adr,referer_fil,opt,liens,lien_tot,back,back_max,cache,hash,ptr,numero_passe); @@ -551,12 +574,12 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // Donner nom par défaut? if (fil[strlen(fil)-1]=='/') { if (!strfield(adr_complete,"ftp://")) - strcat(fil,DEFAULT_HTML); // nommer page par défaut!! + strcatbuff(fil,DEFAULT_HTML); // nommer page par défaut!! else { if (!opt->proxy.active) - strcat(fil,DEFAULT_FTP); // nommer page par défaut (texte) + strcatbuff(fil,DEFAULT_FTP); // nommer page par défaut (texte) else - strcat(fil,DEFAULT_HTML); // nommer page par défaut (à priori ici html depuis un proxy http) + strcatbuff(fil,DEFAULT_HTML); // nommer page par défaut (à priori ici html depuis un proxy http) } } // Changer extension? @@ -574,13 +597,13 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (ext_chg==1) { while((a > fil) && (*a!='.') && (*a!='/')) a--; if (*a=='.') *a='\0'; // couper - strcat(fil,"."); // recopier point + strcatbuff(fil,"."); // recopier point } else { while(( a > fil) && (*a!='/')) a--; if (*a=='/') a++; *a='\0'; } - strcat(fil,ext); // copier ext/nom + strcatbuff(fil,ext); // copier ext/nom } // Rechercher premier / et dernier . @@ -636,24 +659,63 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } *b='\0'; switch(tok=*a++) { - case '[': // %[param] + case '[': // %[param:prefix_if_not_empty:suffix_if_not_empty:empty_replacement:notfound_replacement] if (strchr(a,']')) { - char name[256]; - char* c=name; + int pos=0; + char name[5][256]; + char* c=name[0]; + for(pos = 0 ; pos < 5 ; pos++) { + name[pos][0]='\0'; + } + pos=0; while(*a!=']') { - *c++=*a++; + if (pos < 5) { + if (*a == ':') { // next token + c=name[++pos]; + a++; + } else { + *c++=*a++; + *c='\0'; + } + } } a++; - *c++='\0'; - strcat(name,"="); /* param=.. */ + strcatbuff(name[0],"="); /* param=.. */ c=strchr(fil_complete,'?'); /* parameters exists */ if (c) { - c=strstr(c,name); /* finds param= */ - if (c) { - c+=strlen(name); /* jumps "param=" */ - while( (*c) && (*c!='&')) - *b++=*c++; + char* cp; + while((cp = strstr(c+1, name[0])) && *(cp-1) != '?' && *(cp-1) != '&') { /* finds [?&]param= */ + c = cp; + } + if (cp) { + c = cp + strlen(name[0]); /* jumps "param=" */ + strcpybuff(b, name[1]); /* prefix */ + b += strlen(b); + if (*c != '\0' && *c != '&') { + char* d = name[0]; + /* */ + while(*c != '\0' && *c != '&') { + *d++ = *c++; + } + *d = '\0'; + d = unescape_http(name[0]); + if (d && *d) { + strcpybuff(b, d); /* value */ + b += strlen(b); + } else { + strcpybuff(b, name[3]); /* empty replacement if any */ + b += strlen(b); + } + } else { + strcpybuff(b, name[3]); /* empty replacement if any */ + b += strlen(b); + } + strcpybuff(b, name[2]); /* suffix */ + b += strlen(b); + } else { + strcpybuff(b, name[4]); /* not found replacement if any */ + b += strlen(b); } } } @@ -662,14 +724,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a case 'n': // nom sans ext if (dot_pos) { if (!short_ver) // Noms longs - strncat(b,nom_pos,(int) (dot_pos - nom_pos)); + strncatbuff(b,nom_pos,(int) (dot_pos - nom_pos)); else - strncat(b,nom_pos,min((int) (dot_pos - nom_pos),8)); + strncatbuff(b,nom_pos,min((int) (dot_pos - nom_pos),8)); } else { if (!short_ver) // Noms longs - strcpy(b,nom_pos); + strcpybuff(b,nom_pos); else - strncat(b,nom_pos,8); + strncatbuff(b,nom_pos,8); } b+=strlen(b); // pointer à la fin break; @@ -678,28 +740,28 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a *b='\0'; if (dot_pos) { if (!short_ver) // Noms longs - strncat(b,nom_pos,(int) (dot_pos - nom_pos)); + strncatbuff(b,nom_pos,(int) (dot_pos - nom_pos)); else - strncat(b,nom_pos,min((int) (dot_pos - nom_pos),8)); + strncatbuff(b,nom_pos,min((int) (dot_pos - nom_pos),8)); } else { if (!short_ver) // Noms longs - strcpy(b,nom_pos); + strcpybuff(b,nom_pos); else - strncat(b,nom_pos,8); + strncatbuff(b,nom_pos,8); } b+=strlen(b); // pointer à la fin // RECOPIE NOM + EXT *b='\0'; if (dot_pos) { if (!short_ver) // Noms longs - strcpy(b,dot_pos+1); + strcpybuff(b,dot_pos+1); else - strncat(b,dot_pos+1,3); + strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcpy(b,DEFAULT_EXT); // pas de.. + strcpybuff(b,DEFAULT_EXT); // pas de.. else - strcpy(b,DEFAULT_EXT_SHORT); // pas de.. + strcpybuff(b,DEFAULT_EXT_SHORT); // pas de.. } b+=strlen(b); // pointer à la fin // @@ -708,14 +770,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a *b='\0'; if (dot_pos) { if (!short_ver) // Noms longs - strcpy(b,dot_pos+1); + strcpybuff(b,dot_pos+1); else - strncat(b,dot_pos+1,3); + strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcpy(b,DEFAULT_EXT); // pas de.. + strcpybuff(b,DEFAULT_EXT); // pas de.. else - strcpy(b,DEFAULT_EXT_SHORT); // pas de.. + strcpybuff(b,DEFAULT_EXT_SHORT); // pas de.. } b+=strlen(b); // pointer à la fin break; @@ -723,14 +785,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a *b='\0'; if (nom_pos != fil + 1) { // pas: /index.html (chemin nul) if (!short_ver) { // Noms longs - strncat(b,fil,(int) (nom_pos - fil) - 1); + strncatbuff(b,fil,(int) (nom_pos - fil) - 1); } else { char pth[HTS_URLMAXSIZE*2],n83[HTS_URLMAXSIZE*2]; pth[0]=n83[0]='\0'; // - strncat(pth,fil,(int) (nom_pos - fil) - 1); + strncatbuff(pth,fil,(int) (nom_pos - fil) - 1); long_to_83(opt->savename_83,n83,pth); - strcpy(b,n83); + strcpybuff(b,n83); } } b+=strlen(b); // pointer à la fin @@ -739,14 +801,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a *b='\0'; if (strcmp(adr_complete,"file://")==0) { if (!short_ver) // Noms longs - strcpy(b,"localhost"); + strcpybuff(b,"localhost"); else - strcpy(b,"local"); + strcpybuff(b,"local"); } else { if (!short_ver) // Noms longs - strcpy(b,print_adr); + strcpybuff(b,print_adr); else - strncat(b,print_adr,8); + strncatbuff(b,print_adr,8); } b+=strlen(b); // pointer à la fin break; @@ -756,17 +818,17 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char digest[32+2]; char buff[HTS_URLMAXSIZE*2]; digest[0]=buff[0]='\0'; - strcpy(buff,adr); - strcat(buff,fil_complete); + strcpybuff(buff,adr); + strcatbuff(buff,fil_complete); domd5mem(buff,strlen(buff),digest,1); - strcpy(b,digest); + strcpybuff(b,digest); } b+=strlen(b); // pointer à la fin break; case 'Q': case 'q': /* query MD5 (128-bits/16-bits) GENERATED ONLY IF query string exists! */ *b='\0'; - strncat(b,url_md5(fil_complete),(tok == 'Q')?32:4); + strncatbuff(b,url_md5(fil_complete),(tok == 'Q')?32:4); b+=strlen(b); // pointer à la fin break; } @@ -788,23 +850,23 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (strcmp(adr_complete,"file://")==0) { //## if (*adr==lOCAL_CHAR) { if (opt->savename_83 != 1) // noms longs - strcat(save,"localhost"); + strcatbuff(save,"localhost"); else - strcat(save,"local"); + strcatbuff(save,"local"); } else { // adresse url if (!opt->savename_83) { // noms longs (et pas de .) - strcat(save,print_adr); + strcatbuff(save,print_adr); } else { // noms 8-3 if (strlen(print_adr)>4) { if (strfield(print_adr,"www.")) - strncat(save,print_adr+4,max_char); + strncatbuff(save,print_adr+4,max_char); else - strncat(save,print_adr,8); - } else strncat(save,print_adr,max_char); + strncatbuff(save,print_adr,8); + } else strncatbuff(save,print_adr,max_char); } } - if (*fil!='/') strcat(save,"/"); + if (*fil!='/') strcatbuff(save,"/"); } } @@ -819,7 +881,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a else // index.html ou /index.html url_savename_addstr(save,fil); if (save[strlen(save)-1]=='/') - strcat(save,DEFAULT_HTML); // nommer page par défaut!! + strcatbuff(save,DEFAULT_HTML); // nommer page par défaut!! */ /* add name */ @@ -836,38 +898,38 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (strcmp(adr_complete,"file://")==0) { //## if (*adr==lOCAL_CHAR) { if (opt->savename_83 != 1) // noms longs - strcat(save,"localhost/"); + strcatbuff(save,"localhost/"); else - strcat(save,"local/"); + strcatbuff(save,"local/"); } else { // adresse url if (!opt->savename_83) { // noms longs - strcat(save,print_adr); strcat(save,"/"); + strcatbuff(save,print_adr); strcatbuff(save,"/"); } else { // noms 8-3 if (strlen(print_adr)>4) { if (strfield(print_adr,"www.")) - strncat(save,print_adr+4,max_char); + strncatbuff(save,print_adr+4,max_char); else - strncat(save,print_adr,max_char); - strcat(save,"/"); + strncatbuff(save,print_adr,max_char); + strcatbuff(save,"/"); } else { - strncat(save,print_adr,max_char); strcat(save,"/"); + strncatbuff(save,print_adr,max_char); strcatbuff(save,"/"); } } } } else { - strcat(save,"web/"); // répertoire général + strcatbuff(save,"web/"); // répertoire général } } // si un html à coup sûr if ( (ext_chg!=0) ? (ishtml_ext(ext)==1) : (ishtml(fil)==1) ) { if (opt->savename_type%100==2) { // html/ - strcat(save,"html/"); + strcatbuff(save,"html/"); } } else { if ((opt->savename_type%100==1) || (opt->savename_type%100==2)) { // html & images - strcat(save,"images/"); + strcatbuff(save,"images/"); } } @@ -881,17 +943,17 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // html? if ( (ext_chg!=0) ? (ishtml_ext(ext)==1) : (ishtml(fil)==1) ) { if (opt->savename_type%100==5) - strcat(save,"html/"); + strcatbuff(save,"html/"); } else { char* a=fil+strlen(fil)-1; while(( a> fil) && (*a != '/') && (*a != '.')) a--; if (*a!='.') - strcat(save,"other"); + strcatbuff(save,"other"); else - strcat(save,a+1); - strcat(save,"/"); + strcatbuff(save,a+1); + strcatbuff(save,"/"); } - /*strcat(save,a);*/ + /*strcatbuff(save,a);*/ /* add name */ ADD_STANDARD_NAME(0); } @@ -923,7 +985,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a a=fil+strlen(fil)-1; while(( a > fil) && (*a != '/') && (*a != '.')) a--; if (*a=='.') { - strcat(save,a); // ajouter + strcatbuff(save,a); // ajouter } } break; @@ -933,7 +995,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char* a=fil+strlen(fil)-1; while(((int) a>(int) fil) && (*a != '/') && (*a != '\\')) a--; if ((*a=='/') || (*a=='\\')) a++; - strcat(save,a); + strcatbuff(save,a); */ /* add name */ @@ -947,7 +1009,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a #endif if (save[strlen(save)-1]=='/') - strcat(save,DEFAULT_HTML); // nommer page par défaut!! + strcatbuff(save,DEFAULT_HTML); // nommer page par défaut!! } @@ -958,8 +1020,8 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a while(((int) a>(int) save) && (*a!='.') && (*a!='/')) a--; if (*a=='.') *a='\0'; // couper // recopier extension - strcat(save,"."); - strcat(save,ext); // copier ext + strcatbuff(save,"."); + strcatbuff(save,ext); // copier ext }*/ // de même en cas de manque d'extension on en place une de manière forcée.. // cela évite les /chez/toto et les /chez/toto/index.html incompatibles @@ -967,8 +1029,8 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char* a=save+strlen(save)-1; while(( a > save) && (*a!='.') && (*a!='/')) a--; if (*a!='.') { // agh pas de point - //strcat(save,".none"); // a éviter - strcat(save,".html"); // préférable! + //strcatbuff(save,".none"); // a éviter + strcatbuff(save,".html"); // préférable! if ( (opt->debug>1) && (opt->errlog!=NULL) ) { fspc(opt->errlog,"warning"); fprintf(opt->errlog,"Default HTML type set for %s%s"LF,adr_complete,fil_complete); test_flush; @@ -985,14 +1047,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char tempo[HTS_URLMAXSIZE*2]; char *b; tempo[0]='\0'; - strcpy(tempo,"["); + strcpybuff(tempo,"["); b=strchr(save,':'); if (!b) b=strchr(save,'@'); if (b) - strncat(tempo,save,(int) b-(int) a); - strcat(tempo,"]"); - strcat(tempo,a); - strcpy(save,a); + strncatbuff(tempo,save,(int) b-(int) a); + strcatbuff(tempo,"]"); + strcatbuff(tempo,a); + strcpybuff(save,a); } } */ @@ -1000,8 +1062,8 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // éviter les / au début (cause: N100) if (save[0]=='/') { char tempo[HTS_URLMAXSIZE*2]; - strcpy(tempo,save+1); - strcpy(save,tempo); + strcpybuff(tempo,save+1); + strcpybuff(save,tempo); } // changer les ~,:,",*,? en _ pour sauver sur disque @@ -1017,6 +1079,12 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a hts_replace(save,'|','_'); // interdit sous windows // hts_replace(save,'@','_'); + if (opt->savename_83 == 2) { // CDROM + // maybe other ones? + hts_replace(save,'-','_'); + hts_replace(save,'=','_'); + hts_replace(save,'+','_'); + } // { // éliminer les // (comme ftp://) char* a; @@ -1031,20 +1099,22 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a #if HTS_OVERRIDE_DOS_FOLDERS - /* Replace /foo/nul/bar by /foo/nul-/bar */ + /* Replace /foo/nul/bar by /foo/nul_/bar */ { int i=0; while(hts_tbdev[i][0]) { char* a=save; - while((a=strstr(a,hts_tbdev[i]))) { + while((a=strstrcase(a,(char*)hts_tbdev[i]))) { switch ( (int) a[strlen(hts_tbdev[i])] ) { case '\0': - case '/': { + case '/': + case '.': + { char tempo[HTS_URLMAXSIZE*2]; tempo[0]='\0'; - strncat(tempo,save,(int) (a - save) + strlen(hts_tbdev[i])); - strcat(tempo,"-"); - strcat(tempo,a+strlen(hts_tbdev[i])); - strcpy(save,tempo); + strncatbuff(tempo,save,(int) (a - save) + strlen(hts_tbdev[i])); + strcatbuff(tempo,"_"); + strcatbuff(tempo,a+strlen(hts_tbdev[i])); + strcpybuff(save,tempo); } break; } @@ -1059,7 +1129,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (opt->savename_83) { char n83[HTS_URLMAXSIZE*2]; long_to_83(opt->savename_83,n83,save); - strcpy(save,n83); + strcpybuff(save,n83); } @@ -1079,9 +1149,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // chemin primaire éventuel A METTRE AVANT if (strnotempty(opt->path_html)) { char tempo[HTS_URLMAXSIZE*2]; - strcpy(tempo,opt->path_html); - strcat(tempo,save); - strcpy(save,tempo); + strcpybuff(tempo,opt->path_html); + strcatbuff(tempo,save); + strcpybuff(save,tempo); } @@ -1100,7 +1170,7 @@ printf("\nStart search\n"); #endif #if HTS_HASH - i=hash_read(hash,save,"",0); // lecture type 0 (sav) + i=hash_read(hash,save,"",0,0); // lecture type 0 (sav) if (i>=0) #else for(i=lien_tot-1;i>=0;i--) { @@ -1143,9 +1213,9 @@ printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n",liens[i]->fil,fil_complete) while(( a > save) && (*a!='.') && (*a!='\\') && (*a!='/')) a--; if (*a=='.') - strncat(tempo,save,(int) (a - save)); + strncatbuff(tempo,save,(int) (a - save)); else - strcat(tempo,save); + strcatbuff(tempo,save); // tester la présence d'un -xx (ex: index-2.html -> index-3.html) b=tempo+strlen(tempo)-1; @@ -1172,9 +1242,9 @@ printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n",liens[i]->fil,fil_complete) // ajouter extension if (*a=='.') - strcat(tempo,a); + strcatbuff(tempo,a); - strcpy(save,tempo); + strcpybuff(save,tempo); //printf("switched: %s\n",save); @@ -1204,29 +1274,29 @@ void standard_name(char* b,char* dot_pos,char* nom_pos,char* fil_complete,int sh /* Nom */ if (dot_pos) { if (!short_ver) // Noms longs - strncat(b,nom_pos,(int) (dot_pos - nom_pos)); + strncatbuff(b,nom_pos,(int) (dot_pos - nom_pos)); else - strncat(b,nom_pos,min((int) (dot_pos - nom_pos),8)); + strncatbuff(b,nom_pos,min((int) (dot_pos - nom_pos),8)); } else { if (!short_ver) // Noms longs - strcat(b,nom_pos); + strcatbuff(b,nom_pos); else - strncat(b,nom_pos,8); + strncatbuff(b,nom_pos,8); } /* MD5 - 16 bits */ - strncat(b,url_md5(fil_complete),4); + strncatbuff(b,url_md5(fil_complete),4); /* Ext */ if (dot_pos) { - strcat(b,"."); + strcatbuff(b,"."); if (!short_ver) // Noms longs - strcat(b,dot_pos+1); + strcatbuff(b,dot_pos+1); else - strncat(b,dot_pos+1,3); + strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcat(b,DEFAULT_EXT); // pas de.. + strcatbuff(b,DEFAULT_EXT); // pas de.. else - strcat(b,DEFAULT_EXT_SHORT); // pas de.. + strcatbuff(b,DEFAULT_EXT_SHORT); // pas de.. } } @@ -1243,7 +1313,7 @@ char* url_md5(char* fil_complete) { char buff[HTS_URLMAXSIZE*2]; a++; digest[0]=buff[0]='\0'; - strcat(buff,a); /* query string MD5 */ + strcatbuff(buff,a); /* query string MD5 */ domd5mem(buff,strlen(buff),digest,1); } } |