diff options
Diffstat (limited to 'src/htsname.c')
-rw-r--r-- | src/htsname.c | 367 |
1 files changed, 209 insertions, 158 deletions
diff --git a/src/htsname.c b/src/htsname.c index 8af2062..0176c5c 100644 --- a/src/htsname.c +++ b/src/htsname.c @@ -81,21 +81,21 @@ static const char *hts_tbdev[] = #define URLSAVENAME_WAIT_FOR_AVAILABLE_SOCKET() do { \ int prev = _hts_in_html_parsing; \ - while(back_pluggable_sockets_strict(back, back_max, opt) <= 0) { \ + while(back_pluggable_sockets_strict(sback, opt) <= 0) { \ _hts_in_html_parsing = 6; \ /* Wait .. */ \ - back_wait(back,back_max,opt,cache,0); \ + back_wait(sback,opt,cache,0); \ /* Transfer rate */ \ engine_stats(); \ /* Refresh various stats */ \ - HTS_STAT.stat_nsocket=back_nsoc(back,back_max); \ + HTS_STAT.stat_nsocket=back_nsoc(sback); \ HTS_STAT.stat_errors=fspc(NULL,"error"); \ HTS_STAT.stat_warnings=fspc(NULL,"warning"); \ HTS_STAT.stat_infos=fspc(NULL,"info"); \ - HTS_STAT.nbk=backlinks_done(liens,lien_tot,ptr); \ - HTS_STAT.nb=back_transfered(HTS_STAT.stat_bytes,back,back_max); \ + HTS_STAT.nbk=backlinks_done(sback,liens,lien_tot,ptr); \ + HTS_STAT.nb=back_transfered(HTS_STAT.stat_bytes,sback); \ /* Check */ \ - if (!hts_htmlcheck_loop(back,back_max,-1,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { \ + if (!hts_htmlcheck_loop(sback->lnk, sback->count,-1,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { \ return -1; \ } \ } \ @@ -105,12 +105,23 @@ static const char *hts_tbdev[] = // forme le nom du fichier à sauver (save) à partir de fil et adr // 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) { +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, + struct_back* sback, cache_back* cache, hash_struct* hash, + int ptr, int numero_passe, const lien_back* headers) { + const char* mime_type = headers ? headers->r.contenttype : NULL; + lien_back* const back = sback->lnk; + const int back_max = sback->count; + /* */ char BIGSTK newfil[HTS_URLMAXSIZE*2]; /* ="" */ /*char BIGSTK normadr_[HTS_URLMAXSIZE*2];*/ char BIGSTK normadr_[HTS_URLMAXSIZE*2], normfil_[HTS_URLMAXSIZE*2]; - int protocol = 0; - static const char* protocol_str[] = {"http", "https", "ftp", "file", "unknown"}; + enum { PROTOCOL_HTTP, PROTOCOL_HTTPS, PROTOCOL_FTP, PROTOCOL_FILE, PROTOCOL_MMS, PROTOCOL_UNKNOWN }; + static const char* protocol_str[] = {"http", "https", "ftp", "file", "mms", "unknown"}; + int protocol = PROTOCOL_HTTP; char* normadr; char* normfil; char* fil; @@ -118,7 +129,8 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a char* print_adr; char *start_pos=NULL,*nom_pos=NULL,*dot_pos=NULL; // Position nom et point // pour changement d'extension ou de nom (content-disposition) - int ext_chg=0; + int ext_chg=0, ext_chg_delayed=0; + int is_html=0; char ext[256]; int max_char=0; //CLEAR @@ -175,13 +187,15 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // à afficher sans ftp:// print_adr=jump_protocol(adr); if (strfield(adr_complete, "https:")) { - protocol = 1; + protocol = PROTOCOL_HTTPS; } else if (strfield(adr_complete, "ftp:")) { - protocol = 2; + protocol = PROTOCOL_FTP; } else if (strfield(adr_complete, "file:")) { - protocol = 3; + protocol = PROTOCOL_FILE; + } else if (strfield(adr_complete, "mms:")) { + protocol = PROTOCOL_MMS; } else { - protocol = 0; + protocol = PROTOCOL_HTTP; } // court-circuit pour lien primaire @@ -199,7 +213,6 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a if (liens!=NULL) { int i; -#if HTS_HASH i=hash_read(hash,normadr,normfil,1,opt->urlhack); // recherche table 1 (adr+fil) if (i>=0) { // ok, trouvé strcpybuff(save,liens[i]->sav); @@ -214,34 +227,6 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a 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,normadr)==0) && (strcmp(liens[i]->fil,normfil)==0)) -#else - if ((strfield2(liens[i]->adr,normadr)) && (strfield2(liens[i]->fil,normfil))) -#endif - { // ok c'est le même lien, adresse déja définie - strcpybuff(save,liens[i]->sav); - return 0; - } - if (liens[i]->former_adr) { // tester ancienne loc? -#if HTS_CASSE - if ((strcmp(liens[i]->former_adr,normadr)==0) && (strcmp(liens[i]->former_fil,normfil)==0)) -#else - if ((strfield2(liens[i]->former_adr,normadr)) && (strfield2(liens[i]->former_fil,normfil))) -#endif - { - // copier location moved! - strcpybuff(adr_complete,liens[i]->adr); - strcpybuff(fil_complete,liens[i]->fil); - // et save - strcpybuff(save,liens[i]->sav); // copier (formé à partir du nouveau lien!) - return 0; - } - } - } -#endif // chercher sans / ou avec / dans former { @@ -252,7 +237,6 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a fil_complete_patche[strlen(fil_complete_patche)-1]='\0'; else strcatbuff(fil_complete_patche,"/"); -#if HTS_HASH 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?????) @@ -262,26 +246,6 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a strcpybuff(save,liens[i]->sav); return 0; } -#else - // même boucle en gros - for(i=lien_tot-1;i>=0;i--) { - if (liens[i]->former_adr) { // former-adr? -#if HTS_CASSE - if ((strcmp(liens[i]->former_adr,normadr)==0) && (strcmp(liens[i]->former_fil,fil_complete_patche)==0)) -#else - 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?????) - strcpybuff(adr_complete,liens[i]->adr); - strcpybuff(fil_complete,liens[i]->fil); - // écrire save - strcpybuff(save,liens[i]->sav); - return 0; - } - } - } -#endif } } @@ -298,47 +262,93 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } fil=newfil; } - // décoder % + // Decode remaining % strcpybuff(fil,unescape_http(fil)); - + // , BUT do not decode high chars + //strcpybuff(fil,unescape_http_unharm(fil, 1)); + // YES (not server side, but fs/client side) + +#if HTS_USEMMS + /* .asx hack */ + if (headers != NULL && headers->r.cdispo[0] != 0 + && strfield(headers->r.contenttype, "video/") + && strfield2(get_ext(headers->r.cdispo), "asx") == 0) + { + ext_chg = 1; + strcpybuff(ext, "asx"); + } + else if (headers != NULL && headers->r.contenttype[0] != 0 + && strfield2(headers->r.contenttype, "video/x-ms-asf")) + { + char *exts = get_ext(headers->url_fil); + if (strfield2(exts, "wmv") == 0) + { + ext_chg = 1; + strcpybuff(ext, "wmv"); + } + else if (strfield2(exts, "asf") == 0) + { + ext_chg = 1; + strcpybuff(ext, "asf"); + } + else if (strfield2(exts, "avi") == 0) + { + ext_chg = 1; + strcpybuff(ext, "avi"); + } + else if (strfield2(exts, "asx") == 0) + { + ext_chg = 1; + strcpybuff(ext, "asx"); + } + } +#endif + /* replace shtml to html.. */ - switch (ishtml(fil)) { /* .html,.shtml,.. */ + if (opt->savename_delayed == 2) + is_html = -1; /* ALWAYS delay type */ + else + is_html = ishtml(fil); + switch ( is_html ) { /* .html,.shtml,.. */ case 1: if ( (strfield2(get_ext(fil),"html") == 0) && (strfield2(get_ext(fil),"htm") == 0) - ) { + ) + { strcpybuff(ext,"html"); ext_chg=1; } break; - case 0: - if (!strnotempty(ext)) { - if (is_userknowntype(get_ext(fil))) { // mime known by user - char BIGSTK mime[1024]; - mime[0]=ext[0]='\0'; - get_userhttptype(0,mime,get_ext(fil)); - if (strnotempty(mime)) { - give_mimext(ext,mime); - if (strnotempty(ext)) { - ext_chg=1; - } + case 0: + if (!strnotempty(ext)) { + if (is_userknowntype(fil)) { // mime known by user + char BIGSTK mime[1024]; + mime[0]=ext[0]='\0'; + get_userhttptype(0,mime,fil); + if (strnotempty(mime)) { + give_mimext(ext,mime); + if (strnotempty(ext)) { + ext_chg=1; } } } - break; + } + break; } - // si option check_type activée - if ((opt->check_type) && (!ext_chg)) { - int ishtest; + if (is_html < 0 && opt->check_type && !ext_chg) { + int ishtest=0; if ( (!strfield(adr_complete,"file://")) && (!strfield(adr_complete,"ftp://")) +#if HTS_USEMMS + && (!strfield(adr_complete,"mms://")) +#endif ) { // 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 ((ishtest=ishtml(fil)) < 0) { // on ne sait pas si c'est un html ou un fichier.. + if (opt->savename_delayed == 2 || (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,NULL); // test uniquement if (r.statuscode != -1) { // pas d'erreur de lecture cache @@ -359,11 +369,11 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } } // - } else if (is_userknowntype(fil)) { /* PATCH BY BRIAN SCHRÖDER. - Lookup mimetype not only by extension, - but also by filename */ + } else if (opt->savename_delayed != 2 && is_userknowntype(fil)) { /* PATCH BY BRIAN SCHRÖDER. + Lookup mimetype not only by extension, + but also by filename */ /* Note: "foo.cgi => text/html" means that foo.cgi shall have the text/html MIME file type, - that is, ".html" */ + that is, ".html" */ char BIGSTK mime[1024]; mime[0]=ext[0]='\0'; get_userhttptype(0, mime, fil); @@ -373,7 +383,26 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a ext_chg=1; } } - } else { // test imposible dans le cache, faire une requête + } + // note: if savename_delayed is enabled, the naming will be temporary (and slightly invalid!) + else if (opt->savename_delayed != 0) { + if (mime_type != NULL) { + ext[0] = '\0'; + if (*mime_type) { + give_mimext(ext, mime_type); + } + if (strnotempty(ext)) { + ext_chg = 1; + } + } else { + /* Avoid collisions (no collisionning detection) */ + sprintf(ext, "%x.%s", opt->state.delayedId++, DELAYED_EXT); + ext_chg = 1; + ext_chg_delayed = 1; /* due to naming system */ + } + } + // test imposible dans le cache, faire une requête + else { // #if HTS_ANALYSTE int hihp=_hts_in_html_parsing; @@ -400,9 +429,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a 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) { + if (back_add(sback,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); + b=back_index(sback,curr_adr,curr_fil,BACK_ADD_TEST); if (b>=0) { int stop_looping=0; int petits_tours=0; @@ -410,10 +439,10 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a 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); + back_wait(sback,opt,cache,0); } if (ptr>=0) { - back_fillmax(back,back_max,opt,cache,liens,ptr,numero_passe,lien_tot); + back_fillmax(sback,opt,cache,liens,ptr,numero_passe,lien_tot); } // on est obligé d'appeler le shell pour le refresh.. @@ -424,17 +453,17 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a engine_stats(); // Refresh various stats - HTS_STAT.stat_nsocket=back_nsoc(back,back_max); + HTS_STAT.stat_nsocket=back_nsoc(sback); HTS_STAT.stat_errors=fspc(NULL,"error"); HTS_STAT.stat_warnings=fspc(NULL,"warning"); HTS_STAT.stat_infos=fspc(NULL,"info"); - HTS_STAT.nbk=backlinks_done(liens,lien_tot,ptr); - HTS_STAT.nb=back_transfered(HTS_STAT.stat_bytes,back,back_max); + HTS_STAT.nbk=backlinks_done(sback,liens,lien_tot,ptr); + HTS_STAT.nb=back_transfered(HTS_STAT.stat_bytes,sback); - if (!hts_htmlcheck_loop(back,back_max,b,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { + if (!hts_htmlcheck_loop(sback->lnk, sback->count,b,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { return -1; } else if (_hts_cancel || !back_checkmirror(opt)) { // cancel 2 ou 1 (cancel parsing) - back_delete(opt,cache,back,b); // cancel test + back_delete(opt,cache,sback,b); // cancel test stop_looping = 1; } } @@ -443,11 +472,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a // traitement des 304,303.. if (back[b].status<=0) { - if ( (back[b].r.statuscode==301) - || (back[b].r.statuscode==302) - || (back[b].r.statuscode==303) - || (back[b].r.statuscode==307) - ) { // agh moved.. un tit tour de plus + if (HTTP_IS_REDIRECT(back[b].r.statuscode)) { // agh moved.. un tit tour de plus if ((petits_tours<5) && (former_adr) && (former_fil)) { // on va pas tourner en rond non plus! if ((int) strnotempty(back[b].r.location)) { // location existe! char BIGSTK mov_url[HTS_URLMAXSIZE*2],mov_adr[HTS_URLMAXSIZE*2],mov_fil[HTS_URLMAXSIZE*2]; @@ -480,7 +505,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a NULL) == 1) { /* forbidden */ has_been_moved = 1; - back_maydelete(opt,cache,back,b); // ok + back_maydelete(opt,cache,sback,b); // ok strcpybuff(curr_adr,mov_adr); strcpybuff(curr_fil,mov_fil); mov_url[0]='\0'; @@ -489,9 +514,14 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } // ftp: stop! - if (strfield(mov_url,"ftp://")) { // ftp, ok on arrête + if (strfield(mov_url,"ftp://") +#if HTS_USEMMS + || strfield(mov_url,"mms://") +#endif + ) + { // ftp, ok on arrête has_been_moved = 1; - back_maydelete(opt,cache,back,b); // ok + back_maydelete(opt,cache,sback,b); // ok strcpybuff(curr_adr,mov_adr); strcpybuff(curr_fil,mov_fil); stop_looping = 1; @@ -508,17 +538,17 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } // Ajouter URLSAVENAME_WAIT_FOR_AVAILABLE_SOCKET(); - if (back_add(back,back_max,opt,cache,mov_adr,mov_fil,methode,referer_adr,referer_fil,1,NULL)!=-1) { // OK + if (back_add(sback,opt,cache,mov_adr,mov_fil,methode,referer_adr,referer_fil,1,NULL)!=-1) { // OK if ( (opt->debug>1) && (opt->errlog!=NULL) ) { fspc(opt->errlog,"warning"); fprintf(opt->errlog,"(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; } // libérer emplacement backing actuel et attendre le prochain - back_maydelete(opt,cache,back,b); + back_maydelete(opt,cache,sback,b); strcpybuff(curr_adr,mov_adr); strcpybuff(curr_fil,mov_fil); - b=back_index(back,back_max,curr_adr,curr_fil,methode); + b=back_index(sback,curr_adr,curr_fil,methode); if (!get_test_request) has_been_moved = 1; // sinon ne pas forcer has_been_moved car non déplacé petits_tours++; @@ -560,7 +590,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a 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(opt,cache,back,b); + back_delete(opt,cache,sback,b); return -1; // ERREUR (404 par exemple) */ } @@ -584,7 +614,7 @@ 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_maydelete(opt,cache,back,b); + back_maydelete(opt,cache,sback,b); // --- --- --- // oops, a été déplacé.. on recalcule en récursif (osons!) @@ -594,7 +624,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a 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); + return url_savename(curr_adr,curr_fil,save,NULL,NULL,referer_adr,referer_fil,opt,liens,lien_tot,sback,cache,hash,ptr,numero_passe,NULL); } // --- --- --- @@ -626,9 +656,18 @@ 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://")) + if (!strfield(adr_complete,"ftp://") +#if HTS_USEMMS + && !strfield(adr_complete,"mms://") +#endif + ) + { strcatbuff(fil,DEFAULT_HTML); // nommer page par défaut!! - else { +#if HTS_USEMMS + } else if (strfield(adr_complete,"mms://")) { + strcatbuff(fil,DEFAULT_MMS); +#endif + } else { if (!opt->proxy.active) strcatbuff(fil,DEFAULT_FTP); // nommer page par défaut (texte) else @@ -770,11 +809,15 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a strcpybuff(b, name[4]); /* not found replacement if any */ b += strlen(b); } - } + } else { + strcpybuff(b, name[4]); /* not found replacement if any */ + b += strlen(b); + } } break; case '%': *b++='%'; break; case 'n': // nom sans ext + *b='\0'; if (dot_pos) { if (!short_ver) // Noms longs strncatbuff(b,nom_pos,(int) (dot_pos - nom_pos)); @@ -812,9 +855,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcpybuff(b,DEFAULT_EXT); // pas de.. + strcpybuff(b,DEFAULT_EXT + 1); // pas de.. else - strcpybuff(b,DEFAULT_EXT_SHORT); // pas de.. + strcpybuff(b,DEFAULT_EXT_SHORT + 1); // pas de.. } b+=strlen(b); // pointer à la fin // @@ -828,9 +871,9 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcpybuff(b,DEFAULT_EXT); // pas de.. + strcpybuff(b,DEFAULT_EXT + 1); // pas de.. else - strcpybuff(b,DEFAULT_EXT_SHORT); // pas de.. + strcpybuff(b,DEFAULT_EXT_SHORT + 1); // pas de.. } b+=strlen(b); // pointer à la fin break; @@ -889,6 +932,19 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a strcatbuff(b, protocol_str[protocol]); b+=strlen(b); // pointer à la fin break; + + /* Patch by Juan Fco Rodriguez to get the full query string */ + case 'k': + { + char *d = strchr(fil_complete,'?'); + if( d != NULL ) + { + strcatbuff(b, d); + b+=strlen(b); + } + } + break; + } } else *b++=*a++; @@ -928,9 +984,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } } -#if HTS_CASSE==0 hts_lowcase(save); -#endif /* // ne sert à rien car a déja été filtré normalement @@ -981,13 +1035,13 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } // si un html à coup sûr - if ( (ext_chg!=0) ? (ishtml_ext(ext)==1) : (ishtml(fil)==1) ) { + if ( (ext_chg!=0) ? (ishtml_ext(ext) == 1) : (ishtml(fil)==1) ) { if (opt->savename_type%100==2) { // html/ - strcatbuff(save,"html/"); + strcatbuff(save, "html/"); } } else { if ((opt->savename_type%100==1) || (opt->savename_type%100==2)) { // html & images - strcatbuff(save,"images/"); + strcatbuff(save, "images/"); } } @@ -1062,9 +1116,7 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a break; } -#if HTS_CASSE==0 hts_lowcase(save); -#endif if (save[strlen(save)-1]=='/') strcatbuff(save,DEFAULT_HTML); // nommer page par défaut!! @@ -1246,6 +1298,24 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a } #endif + /* Ensure that the MANDATORY "temporary" extension is set */ + if (ext_chg_delayed) { + char *ptr; + char *lastDot = NULL; + for(ptr = save ; *ptr != 0 ; ptr++) { + if (*ptr == '.') { + lastDot = ptr; + } else if (*ptr == '/' || *ptr == '\\') { + lastDot = NULL; + } + } + if (lastDot == NULL) { + strcatbuff(save, "." DELAYED_EXT); + } else if (!IS_DELAYED_EXT(save)) { + strcatbuff(lastDot, "." DELAYED_EXT); + } + } + // chemin primaire éventuel A METTRE AVANT if (strnotempty(opt->path_html)) { char BIGSTK tempo[HTS_URLMAXSIZE*2]; @@ -1269,29 +1339,17 @@ int url_savename(char* adr_complete,char* fil_complete,char* save,char* former_a printf("\nStart search\n"); #endif -#if HTS_HASH i=hash_read(hash,save,"",0,0); // lecture type 0 (sav) if (i>=0) -#else - for(i=lien_tot-1;i>=0;i--) { -#if DEBUG_SAVENAME -printf("%cParse: %d",13,i); -#endif - - if (liens[i]->sav_len==len) { // même taille de chaîne -#if HTS_CASSE - if (strcmp(liens[i]->sav,save)==0) // existe déja -#else - if (strfield2(liens[i]->sav,save)) // un tel nom existe déja -#endif -#endif { -#if HTS_CASSE - if ((strcmp(liens[i]->adr,adr)==0) && (strcmp(liens[i]->fil,fil_complete)==0)) -#else - if ((strfield2(liens[i]->adr, normadr)) && (strfield2(liens[i]->fil, normfil))) - //if ((strfield2(liens[i]->adr,adr)) && (strfield2(liens[i]->fil,fil_complete))) -#endif + int sameAdr = ( strfield2(liens[i]->adr, normadr) != 0 ); + int sameFil; + // NO - URL hack is only for stripping // and www. + //if (opt->urlhack != 0) + // sameFil = ( strfield2(liens[i]->fil, normfil) != 0); + //else + sameFil = ( strcmp(liens[i]->fil, normfil) == 0); + if (sameAdr && sameFil) { // ok c'est le même lien, adresse déja définie /* Take the existing name not to screw up with cAsE sEnSiTiViTy of Linux/Unix */ if (strcmp(liens[i]->sav, save) != 0) { @@ -1301,13 +1359,12 @@ printf("%cParse: %d",13,i); #if DEBUG_SAVENAME printf("\nOK ALREADY DEFINED\n",13,i); #endif -#if HTS_CASSE -#endif } else { // utilisé par un AUTRE, changer de nom char BIGSTK tempo[HTS_URLMAXSIZE*2]; char* a=save+strlen(save)-1; char* b; int n=2; + char collisionSeparator = ( (opt->savename_83 != 2) ? '-' : '_'); tempo[0]='\0'; #if DEBUG_SAVENAME @@ -1325,7 +1382,7 @@ printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n",liens[i]->fil,fil_complete) // tester la présence d'un -xx (ex: index-2.html -> index-3.html) b=tempo+strlen(tempo)-1; while (isdigit((unsigned char)*b)) b--; - if (*b=='-') { + if (*b == collisionSeparator) { sscanf(b+1,"%d",&n); *b='\0'; // couper n++; // plus un @@ -1343,7 +1400,7 @@ printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n",liens[i]->fil,fil_complete) } // ajouter -xx (ex: index.html -> index-2.html) - sprintf(tempo+strlen(tempo),"-%d",n); + sprintf(tempo+strlen(tempo),"%c%d", collisionSeparator, n); // ajouter extension if (*a=='.') @@ -1354,13 +1411,7 @@ printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n",liens[i]->fil,fil_complete) //printf("switched: %s\n",save); } // if -#if HTS_HASH } -#else - } // if - } // if sav_len - } // for -#endif #if DEBUG_SAVENAME printf("\nEnd search, %s\n",fil_complete); #endif @@ -1399,9 +1450,9 @@ void standard_name(char* b,char* dot_pos,char* nom_pos,char* fil_complete,int sh strncatbuff(b,dot_pos+1,3); } else { if (!short_ver) // Noms longs - strcatbuff(b,DEFAULT_EXT); // pas de.. + strcatbuff(b,DEFAULT_EXT + 1); // pas de.. else - strcatbuff(b,DEFAULT_EXT_SHORT); // pas de.. + strcatbuff(b,DEFAULT_EXT_SHORT + 1); // pas de.. } } |