diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-29 15:42:53 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2014-05-29 15:42:53 +0000 |
commit | 4f5776a8fac840619f01a61a3655a4608e04d9fd (patch) | |
tree | b9bb0b6ce0eb39118ed5646f66687a616890248a /src/htsname.c | |
parent | 8adeadbdb63e1cb8e4d62fe400ffefada9122d86 (diff) |
Big cleanup: introducing cleaner lien_adrfilsave and lien_adrfil structures holding address/uri or address/uri/filename rather than passing opaque char* of unknown size.
Diffstat (limited to 'src/htsname.c')
-rw-r--r-- | src/htsname.c | 332 |
1 files changed, 165 insertions, 167 deletions
diff --git a/src/htsname.c b/src/htsname.c index ace3a33..ec6a839 100644 --- a/src/htsname.c +++ b/src/htsname.c @@ -47,15 +47,15 @@ Please visit our Website: http://www.httrack.com { /* ajout nom */\ char BIGSTK buff[HTS_URLMAXSIZE*2];\ buff[0]='\0';\ - strncatbuff(buff,start_pos,(int) (nom_pos - start_pos));\ - url_savename_addstr(save,buff);\ + strncatbuff(buff,start_pos,nom_pos - start_pos);\ + url_savename_addstr(afs->save, buff);\ } #define ADD_STANDARD_NAME(shortname) \ { /* ajout nom */\ char BIGSTK buff[HTS_URLMAXSIZE*2];\ standard_name(buff,dot_pos,nom_pos,fil_complete,(shortname));\ - url_savename_addstr(save,buff);\ + url_savename_addstr(afs->save, buff);\ } /* Avoid stupid DOS system folders/file such as 'nul' */ @@ -82,11 +82,11 @@ static const char *hts_tbdev[] = { HTS_STAT.stat_errors=fspc(opt,NULL,"error"); \ HTS_STAT.stat_warnings=fspc(opt,NULL,"warning"); \ HTS_STAT.stat_infos=fspc(opt,NULL,"info"); \ - HTS_STAT.nbk=backlinks_done(sback,liens,lien_tot,ptr); \ + HTS_STAT.nbk=backlinks_done(sback,opt->liens,opt->lien_tot,ptr); \ HTS_STAT.nb=back_transferred(HTS_STAT.stat_bytes,sback); \ /* Check */ \ { \ - if (!RUN_CALLBACK7(opt, loop, sback->lnk, sback->count,-1,ptr,lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { \ + if (!RUN_CALLBACK7(opt, loop, sback->lnk, sback->count,-1,ptr,opt->lien_tot,(int) (time_local()-HTS_STAT.stat_timestart),&HTS_STAT)) { \ return -1; \ } \ } \ @@ -139,10 +139,10 @@ static void cleanEndingSpaceOrDot(char *s) { // 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, const char *referer_adr, - const char *referer_fil, httrackp * opt, lien_url ** liens, - int lien_tot, struct_back * sback, cache_back * cache, +int url_savename(lien_adrfilsave *const afs, + lien_adrfil *const former, + const char *referer_adr, const char *referer_fil, + httrackp * opt, struct_back * sback, cache_back * cache, hash_struct * hash, int ptr, int numero_passe, const lien_back * headers) { char catbuff[CATBUFF_SIZE]; @@ -152,7 +152,10 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, lien_back *const back = sback->lnk; /* */ - char BIGSTK newfil[HTS_URLMAXSIZE * 2]; /* ="" */ + char BIGSTK fil[HTS_URLMAXSIZE * 2]; /* ="" */ + + const char *const adr_complete = afs->af.adr; + const char *const fil_complete = afs->af.fil; /*char BIGSTK normadr_[HTS_URLMAXSIZE*2]; */ char BIGSTK normadr_[HTS_URLMAXSIZE * 2], normfil_[HTS_URLMAXSIZE * 2]; @@ -162,12 +165,11 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, { "http", "https", "ftp", "file", "unknown" }; int protocol = PROTOCOL_HTTP; const char *const adr = jump_identification(adr_complete); - char *fil = fil_complete; // copy of fil, used for lookups (see urlhack) const char *normadr = adr; - const char *normfil = fil; + const char *normfil = fil_complete; const char *const print_adr = jump_protocol(adr); - char *start_pos = NULL, *nom_pos = NULL, *dot_pos = NULL; // Position nom et point + const 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, ext_chg_delayed = 0; @@ -176,8 +178,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, int max_char = 0; //CLEAR - newfil[0] = ext[0] = '\0'; - save[0] = '\0'; + fil[0] = ext[0] = '\0'; + afs->save[0] = '\0'; /* 8-3 ? */ switch (opt->savename_83) { @@ -199,7 +201,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, if (opt->urlhack) { // copy of adr (without protocol), used for lookups (see urlhack) normadr = adr_normalized(adr, normadr_); - normfil = fil_normalized(fil, normfil_); + normfil = fil_normalized(fil_complete, normfil_); } else { if (link_has_authority(adr_complete)) { // https or other protocols : in "http/" subfolder char *pos = strchr(adr_complete, ':'); @@ -227,8 +229,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // court-circuit pour lien primaire if (strnotempty(adr) == 0) { - if (strcmp(fil, "primary") == 0) { - strcatbuff(save, "primary.html"); + if (strcmp(fil_complete, "primary") == 0) { + strcatbuff(afs->save, "primary.html"); return 0; } } @@ -259,21 +261,21 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // vérifier que le nom n'a pas déja été calculé (si oui le renvoyer tel que) // vérifier que le nom n'est pas déja pris... // NOTE: si on cherche /toto/ et que /toto est trouvé on le prend (et réciproquqment) ** // ** - if (liens != NULL) { + if (opt->liens != NULL) { int i; i = hash_read(hash, normadr, normfil, HASH_STRUCT_ADR_PATH); // recherche table 1 (adr+fil) if (i >= 0) { // ok, trouvé - strcpybuff(save, liens[i]->sav); + strcpybuff(afs->save, heap(i)->sav); return 0; } - i = hash_read(hash, normadr, normfil, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former_adr+former_fil) + i = hash_read(hash, normadr, normfil, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former->adr+former->fil) if (i >= 0) { // ok, trouvé // copier location moved! - strcpybuff(adr_complete, liens[i]->adr); - strcpybuff(fil_complete, liens[i]->fil); + strcpybuff(afs->af.adr, heap(i)->adr); + strcpybuff(afs->af.fil, heap(i)->fil); // et save - strcpybuff(save, liens[i]->sav); // copier (formé à partir du nouveau lien!) + strcpybuff(afs->save, heap(i)->sav); // copier (formé à partir du nouveau lien!) return 0; } // chercher sans / ou avec / dans former @@ -286,13 +288,13 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, fil_complete_patche[strlen(fil_complete_patche) - 1] = '\0'; else strcatbuff(fil_complete_patche, "/"); - i = hash_read(hash, normadr, fil_complete_patche, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former_adr+former_fil) + i = hash_read(hash, normadr, fil_complete_patche, HASH_STRUCT_ORIGINAL_ADR_PATH); // recherche table 2 (former->adr+former->fil) if (i >= 0) { - // écraser fil et adr (pas former_fil?????) - strcpybuff(adr_complete, liens[i]->adr); - strcpybuff(fil_complete, liens[i]->fil); + // écraser fil et adr (pas former->fil?????) + strcpybuff(afs->af.adr, heap(i)->adr); + strcpybuff(afs->af.fil, heap(i)->fil); // écrire save - strcpybuff(save, liens[i]->sav); + strcpybuff(afs->save, heap(i)->sav); return 0; } } @@ -303,13 +305,12 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, { char *a; - a = strchr(fil, '?'); + a = strchr(fil_complete, '?'); if (a != NULL) { - strncatbuff(newfil, fil, (int) (a - fil)); + strncatbuff(fil, fil_complete, a - fil_complete); } else { - strcpybuff(newfil, fil); + strcpybuff(fil, fil_complete); } - fil = newfil; } // decode remaining % (normally not necessary; already done in htsparse.c) @@ -465,8 +466,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // int hihp = opt->state._hts_in_html_parsing; int has_been_moved = 0; - char BIGSTK curr_adr[HTS_URLMAXSIZE * 2], - curr_fil[HTS_URLMAXSIZE * 2]; + lien_adrfil current; /* Ensure we don't use too many sockets by using a "testing" one If we have only 1 simultaneous connection authorized, wait for pending download @@ -475,20 +475,20 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, URLSAVENAME_WAIT_FOR_AVAILABLE_SOCKET(); /* Rock'in */ - curr_adr[0] = curr_fil[0] = '\0'; + current.adr[0] = current.fil[0] = '\0'; opt->state._hts_in_html_parsing = 2; // test hts_log_print(opt, LOG_DEBUG, "Testing link type %s%s", adr_complete, fil_complete); - strcpybuff(curr_adr, adr_complete); - strcpybuff(curr_fil, fil_complete); + strcpybuff(current.adr, adr_complete); + strcpybuff(current.fil, fil_complete); // ajouter dans le backing le fichier en mode test // savename: rien car en mode test if (back_add - (sback, opt, cache, curr_adr, curr_fil, BACK_ADD_TEST, + (sback, opt, cache, current.adr, current.fil, BACK_ADD_TEST, referer_adr, referer_fil, 1) != -1) { int b; - b = back_index(opt, sback, curr_adr, curr_fil, BACK_ADD_TEST); + b = back_index(opt, sback, current.adr, current.fil, BACK_ADD_TEST); if (b >= 0) { int stop_looping = 0; int petits_tours = 0; @@ -511,11 +511,11 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, HTS_STAT.stat_errors = fspc(opt, NULL, "error"); HTS_STAT.stat_warnings = fspc(opt, NULL, "warning"); HTS_STAT.stat_infos = fspc(opt, NULL, "info"); - HTS_STAT.nbk = backlinks_done(sback, liens, lien_tot, ptr); + HTS_STAT.nbk = backlinks_done(sback, opt->liens, opt->lien_tot, ptr); HTS_STAT.nb = back_transferred(HTS_STAT.stat_bytes, sback); if (!RUN_CALLBACK7 - (opt, loop, sback->lnk, sback->count, b, ptr, lien_tot, + (opt, loop, sback->lnk, sback->count, b, ptr, opt->lien_tot, (int) (time_local() - HTS_STAT.stat_timestart), &HTS_STAT)) { return -1; @@ -526,42 +526,40 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // traitement des 304,303.. if (back[b].status <= 0) { 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]; - mov_url[0] = mov_adr[0] = mov_fil[0] = '\0'; + if ((petits_tours < 5) && former != NULL) { // on va pas tourner en rond non plus! + if (strnotempty(back[b].r.location)) { // location existe! + char BIGSTK mov_url[HTS_URLMAXSIZE * 2]; + lien_adrfil moved; + mov_url[0] = moved.adr[0] = moved.fil[0] = '\0'; // strcpybuff(mov_url, back[b].r.location); // copier URL if (ident_url_relatif - (mov_url, curr_adr, curr_fil, mov_adr, - mov_fil) >= 0) { + (mov_url, current.adr, current.fil, &moved) >= 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)) + if ((strcmp(moved.adr, current.adr)) + || (strcmp(moved.fil, current.fil)) || (get_test_request == 0)) { // bouclage? - if ((!strcmp(mov_adr, curr_adr)) - && (!strcmp(mov_fil, curr_fil))) + if ((!strcmp(moved.adr, current.adr)) + && (!strcmp(moved.fil, current.fil))) get_test_request = 1; // faire requète avec GET - // recopier former_adr/fil? - if ((former_adr) && (former_fil)) { - if (strnotempty(former_adr) == 0) { // Pas déja noté - strcpybuff(former_adr, curr_adr); - strcpybuff(former_fil, curr_fil); + // recopier former->adr/fil? + if (former != NULL) { + if (strnotempty(former->adr) == 0) { // Pas déja noté + strcpybuff(former->adr, current.adr); + strcpybuff(former->fil, current.fil); } } // check explicit forbidden - don't follow 3xx in this case { int set_prio_to = 0; - if (hts_acceptlink(opt, ptr, lien_tot, liens, mov_adr, mov_fil, NULL, NULL, &set_prio_to, NULL) == 1) { /* forbidden */ + if (hts_acceptlink(opt, ptr, moved.adr, moved.fil, NULL, NULL, &set_prio_to, NULL) == 1) { /* forbidden */ has_been_moved = 1; back_maydelete(opt, cache, sback, b); // ok - strcpybuff(curr_adr, mov_adr); - strcpybuff(curr_fil, mov_fil); + strcpybuff(current.adr, moved.adr); + strcpybuff(current.fil, moved.fil); mov_url[0] = '\0'; stop_looping = 1; } @@ -572,8 +570,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, ) { // ftp, ok on arrête has_been_moved = 1; back_maydelete(opt, cache, sback, b); // ok - strcpybuff(curr_adr, mov_adr); - strcpybuff(curr_fil, mov_fil); + strcpybuff(current.adr, moved.adr); + strcpybuff(current.fil, moved.fil); stop_looping = 1; } else if (*mov_url) { const char *methode; @@ -584,24 +582,24 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, methode = BACK_ADD_TEST2; // tester avec GET hts_log_print(opt, LOG_WARNING, "Loop with HEAD request (during prefetch) at %s%s", - curr_adr, curr_fil); + current.adr, current.fil); } // Ajouter URLSAVENAME_WAIT_FOR_AVAILABLE_SOCKET(); - if (back_add(sback, opt, cache, mov_adr, mov_fil, methode, referer_adr, referer_fil, 1) != -1) { // OK + if (back_add(sback, opt, cache, moved.adr, moved.fil, methode, referer_adr, referer_fil, 1) != -1) { // OK hts_log_print(opt, LOG_DEBUG, "(during prefetch) %s (%d) to link %s at %s%s", back[b].r.msg, back[b].r.statuscode, - back[b].r.location, curr_adr, - curr_fil); + back[b].r.location, current.adr, + current.fil); // libérer emplacement backing actuel et attendre le prochain back_maydelete(opt, cache, sback, b); - strcpybuff(curr_adr, mov_adr); - strcpybuff(curr_fil, mov_fil); + strcpybuff(current.adr, moved.adr); + strcpybuff(current.fil, moved.fil); b = - back_index(opt, sback, curr_adr, curr_fil, + back_index(opt, sback, current.adr, current.fil, methode); if (!get_test_request) has_been_moved = 1; // sinon ne pas forcer has_been_moved car non déplacé @@ -610,7 +608,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } else { // sinon on fait rien et on s'en va.. (ftp etc) hts_log_print(opt, LOG_DEBUG, "Warning: Savename redirect backing error at %s%s", - mov_adr, mov_fil); + moved.adr, moved.fil); } } } else { @@ -672,13 +670,13 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // 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) - strcpybuff(adr_complete, curr_adr); - strcpybuff(fil_complete, curr_fil); + strcpybuff(afs->af.adr, current.adr); + strcpybuff(afs->af.fil, current.fil); // copier adr, fil - return url_savename(curr_adr, curr_fil, save, NULL, NULL, - referer_adr, referer_fil, opt, liens, - lien_tot, sback, cache, hash, ptr, + return url_savename(afs, NULL, + referer_adr, referer_fil, opt, + sback, cache, hash, ptr, numero_passe, NULL); } // --- --- --- @@ -748,7 +746,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } // Rechercher premier / et dernier . { - char *a = fil + strlen(fil) - 1; + const char *a = fil + strlen(fil) - 1; // passer structures start_pos = fil; @@ -769,7 +767,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // ajouter nom du site éventuellement en premier if (opt->savename_type == -1) { // utiliser savename_userdef! (%h%p/%n%q.%t) const char *a = StringBuff(opt->savename_userdef); - char *b = save; + char *b = afs->save; /*char *nom_pos=NULL,*dot_pos=NULL; // Position nom et point */ char tok; @@ -790,7 +788,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, */ // Construire nom - while((*a) && (((int) (b - save)) < HTS_URLMAXSIZE)) { // parser, et pas trop long.. + while((*a) && (((int) (b - afs->save)) < HTS_URLMAXSIZE)) { // parser, et pas trop long.. if (*a == '%') { int short_ver = 0; @@ -1047,26 +1045,26 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // adresse url if (!opt->savename_83) { // noms longs (et pas de .) - strcatbuff(save, final_adr); + strcatbuff(afs->save, final_adr); } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) - hts_appendStringUTF8(save, final_adr + 4, max_char); + hts_appendStringUTF8(afs->save, final_adr + 4, max_char); else - hts_appendStringUTF8(save, final_adr, max_char); + hts_appendStringUTF8(afs->save, final_adr, max_char); } else - hts_appendStringUTF8(save, final_adr, max_char); + hts_appendStringUTF8(afs->save, final_adr, max_char); } /* release */ RELEASE_ADR(); if (*fil != '/') - strcatbuff(save, "/"); + strcatbuff(afs->save, "/"); } } - hts_lowcase(save); + hts_lowcase(afs->save); /* // ne sert à rien car a déja été filtré normalement @@ -1092,42 +1090,42 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, DECLARE_ADR(final_adr); if (!opt->savename_83) { // noms longs - strcatbuff(save, final_adr); - strcatbuff(save, "/"); + strcatbuff(afs->save, final_adr); + strcatbuff(afs->save, "/"); } else { // noms 8-3 if (strlen(final_adr) > 4) { if (strfield(final_adr, "www.")) - hts_appendStringUTF8(save, final_adr + 4, max_char); + hts_appendStringUTF8(afs->save, final_adr + 4, max_char); else - hts_appendStringUTF8(save, final_adr, max_char); - strcatbuff(save, "/"); + hts_appendStringUTF8(afs->save, final_adr, max_char); + strcatbuff(afs->save, "/"); } else { - hts_appendStringUTF8(save, final_adr, max_char); - strcatbuff(save, "/"); + hts_appendStringUTF8(afs->save, final_adr, max_char); + strcatbuff(afs->save, "/"); } } /* release */ RELEASE_ADR(); } else { - strcatbuff(save, "web/"); // répertoire général + strcatbuff(afs->save, "web/"); // répertoire général } } // si un html à coup sûr if ((ext_chg != 0) ? (ishtml_ext(ext) == 1) : (ishtml(opt, fil) == 1)) { if (opt->savename_type % 100 == 2) { // html/ - strcatbuff(save, "html/"); + strcatbuff(afs->save, "html/"); } } else { if ((opt->savename_type % 100 == 1) || (opt->savename_type % 100 == 2)) { // html & images - strcatbuff(save, "images/"); + strcatbuff(afs->save, "images/"); } } switch (opt->savename_type % 100) { case 4: case 5:{ // séparer par types - char *a = fil + strlen(fil) - 1; + const char *a = fil + strlen(fil) - 1; // passer structures while((a > fil) && (*a != '/') && (*a != '\\')) @@ -1138,17 +1136,17 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // html? if ((ext_chg != 0) ? (ishtml_ext(ext) == 1) : (ishtml(opt, fil) == 1)) { if (opt->savename_type % 100 == 5) - strcatbuff(save, "html/"); + strcatbuff(afs->save, "html/"); } else { - char *a = fil + strlen(fil) - 1; + const char *a = fil + strlen(fil) - 1; while((a > fil) && (*a != '/') && (*a != '.')) a--; if (*a != '.') - strcatbuff(save, "other"); + strcatbuff(afs->save, "other"); else - strcatbuff(save, a + 1); - strcatbuff(save, "/"); + strcatbuff(afs->save, a + 1); + strcatbuff(afs->save, "/"); } /*strcatbuff(save,a); */ /* add name */ @@ -1157,8 +1155,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, break; case 99:{ // 'codé' .. c'est un gadget size_t i; - int j; - char *a; + size_t j; + const char *a; char C[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-"; int L; @@ -1174,19 +1172,19 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } srand(s); - j = (int) strlen(save); + j = strlen(afs->save); for(i = 0; i < 8; i++) { char c = C[(rand() % L)]; - save[i + j] = c; + afs->save[i + j] = c; } - save[i + j] = '\0'; + afs->save[i + j] = '\0'; // ajouter extension a = fil + strlen(fil) - 1; while((a > fil) && (*a != '/') && (*a != '.')) a--; if (*a == '.') { - strcatbuff(save, a); // ajouter + strcatbuff(afs->save, a); // ajouter } } break; @@ -1205,10 +1203,10 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, break; } - hts_lowcase(save); + hts_lowcase(afs->save); - if (save[strlen(save) - 1] == '/') - strcatbuff(save, DEFAULT_HTML); // nommer page par défaut!! + if (afs->save[strlen(afs->save) - 1] == '/') + strcatbuff(afs->save, DEFAULT_HTML); // nommer page par défaut!! } // vérifier qu'on ne doit pas forcer l'extension @@ -1226,23 +1224,23 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // 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 if (opt->savename_type != -1 && opt->savename_delayed != 2) { - char *a = save + strlen(save) - 1; + char *a = afs->save + strlen(afs->save) - 1; - while((a > save) && (*a != '.') && (*a != '/')) + while((a > afs->save) && (*a != '.') && (*a != '/')) a--; if (*a != '.') { // agh pas de point //strcatbuff(save,".none"); // a éviter - strcatbuff(save, ".html"); // préférable! + strcatbuff(afs->save, ".html"); // préférable! hts_log_print(opt, LOG_DEBUG, "Default HTML type set for %s%s => %s", - adr_complete, fil_complete, save); + adr_complete, fil_complete, afs->save); } } // effacer pass au besoin pour les autentifications // (plus la peine : masqué au début) /* { - char* a=jump_identification(save); - if (a!=save) { + char* a=jump_identification(afs->save); + if (a!=afs->save) { char BIGSTK tempo[HTS_URLMAXSIZE*2]; char *b; tempo[0]='\0'; @@ -1259,18 +1257,18 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, */ // éviter les / au début (cause: N100) - if (save[0] == '/') { + if (afs->save[0] == '/') { char BIGSTK tempo[HTS_URLMAXSIZE * 2]; - strcpybuff(tempo, save + 1); - strcpybuff(save, tempo); + strcpybuff(tempo, afs->save + 1); + strcpybuff(afs->save, tempo); } /* Cleanup reserved or forbidden characters. */ { size_t i; - for(i = 0 ; save[i] != '\0' ; i++) { - unsigned char c = (unsigned char) save[i]; + for(i = 0 ; afs->save[i] != '\0' ; i++) { + unsigned char c = (unsigned char) afs->save[i]; if (c < 32 // control || c == 127 // unwise || c == '~' // unix unwise @@ -1295,13 +1293,13 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, ) ) { - save[i] = '_'; + afs->save[i] = '_'; } } } // éliminer les // (comme ftp://) - cleanDoubleSlash(save); + cleanDoubleSlash(afs->save); #if HTS_OVERRIDE_DOS_FOLDERS /* Replace /foo/nul/bar by /foo/nul_/bar */ @@ -1309,7 +1307,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, int i = 0; while(hts_tbdev[i][0]) { - char *a = save; + char *a = afs->save; while((a = strstrcase(a, (char *) hts_tbdev[i]))) { switch ((int) a[strlen(hts_tbdev[i])]) { @@ -1320,10 +1318,10 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, char BIGSTK tempo[HTS_URLMAXSIZE * 2]; tempo[0] = '\0'; - strncatbuff(tempo, save, (int) (a - save) + strlen(hts_tbdev[i])); + strncatbuff(tempo, afs->save, (int) (a - afs->save) + strlen(hts_tbdev[i])); strcatbuff(tempo, "_"); strcatbuff(tempo, a + strlen(hts_tbdev[i])); - strcpybuff(save, tempo); + strcpybuff(afs->save, tempo); } break; } @@ -1334,7 +1332,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } /* Strip ending . or ' ' forbidden on windoz */ - cleanEndingSpaceOrDot(save); + cleanEndingSpaceOrDot(afs->save); #endif @@ -1342,8 +1340,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, if (opt->savename_83) { char BIGSTK n83[HTS_URLMAXSIZE * 2]; - long_to_83(opt->savename_83, n83, save); - strcpybuff(save, n83); + long_to_83(opt->savename_83, n83, afs->save); + strcpybuff(afs->save, n83); } // enforce stricter ISO9660 compliance (bug reported by Steffo Carlsson) // Level 1 File names are restricted to 8 characters with a 3 character extension, @@ -1354,12 +1352,12 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, if (opt->savename_83 > 0) { char *a, *last; - for(last = save + strlen(save) - 1; - last != save && *last != '/' && *last != '\\' && *last != '.'; last--) ; + for(last = afs->save + strlen(afs->save) - 1; + last != afs->save && *last != '/' && *last != '\\' && *last != '.'; last--) ; if (*last != '.') { last = NULL; } - for(a = save; *a != '\0'; a++) { + for(a = afs->save; *a != '\0'; a++) { if (*a >= 'a' && *a <= 'z') { *a -= 'a' - 'A'; } else if (*a == '.') { @@ -1376,7 +1374,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } /* ensure that there is no ../ (potential vulnerability) */ - fil_simplifie(save); + fil_simplifie(afs->save); /* convert name to UTF-8 ? Note: already done while parsing. */ //if (charset != NULL && charset[0] != '\0') { @@ -1393,17 +1391,17 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, /* callback */ RUN_CALLBACK5(opt, savename, adr_complete, fil_complete, referer_adr, - referer_fil, save); + referer_fil, afs->save); hts_log_print(opt, LOG_DEBUG, "engine: save-name: local name: %s%s -> %s", - adr, fil, save); + adr, fil, afs->save); /* Ensure that the MANDATORY "temporary" extension is set */ if (ext_chg_delayed) { char *ptr; char *lastDot = NULL; - for(ptr = save; *ptr != 0; ptr++) { + for(ptr = afs->save; *ptr != 0; ptr++) { if (*ptr == '.') { lastDot = ptr; } else if (*ptr == '/' || *ptr == '\\') { @@ -1411,8 +1409,8 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } } if (lastDot == NULL) { - strcatbuff(save, "." DELAYED_EXT); - } else if (!IS_DELAYED_EXT(save)) { + strcatbuff(afs->save, "." DELAYED_EXT); + } else if (!IS_DELAYED_EXT(afs->save)) { strcatbuff(lastDot, "." DELAYED_EXT); } } @@ -1425,12 +1423,12 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, #define MIN_LAST_SEG_RESERVE 12 #define MAX_LAST_SEG_RESERVE 24 #define MAX_SEG_LEN 48 - if (hts_stringLengthUTF8(save) + + if (hts_stringLengthUTF8(afs->save) + hts_stringLengthUTF8(StringBuff(opt->path_html_utf8)) >= HTS_MAX_PATH_LEN) { // convert to Unicode (much simpler) size_t wsaveLen; - hts_UCS4 *const wsave = hts_convertUTF8StringToUCS4(save, strlen(save), &wsaveLen); + hts_UCS4 *const wsave = hts_convertUTF8StringToUCS4(afs->save, strlen(afs->save), &wsaveLen); if (wsave != NULL) { const size_t parentLen = hts_stringLengthUTF8(StringBuff(opt->path_html_utf8)); @@ -1485,7 +1483,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // copy final name and cleanup saveFinal = hts_convertUCS4StringToUTF8(wsave, j); if (saveFinal != NULL) { - strcpybuff(save, saveFinal); + strcpybuff(afs->save, saveFinal); free(saveFinal); } else { hts_log_print(opt, LOG_ERROR, "Could not revert to UTF-8: %s%s", @@ -1495,13 +1493,13 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, // log in debug hts_log_print(opt, LOG_DEBUG, "Too long filename shortened: %s%s => %s", - adr_complete, fil_complete, save); + adr_complete, fil_complete, afs->save); } else { - hts_log_print(opt, LOG_ERROR, "Could not read UTF-8: %s", save); + hts_log_print(opt, LOG_ERROR, "Could not read UTF-8: %s", afs->save); } // Re-check again ending space or dot after cut (see bug #5) - cleanEndingSpaceOrDot(save); + cleanEndingSpaceOrDot(afs->save); } #undef MAX_UTF8_SEQ_CHARS #undef MIN_LAST_SEG_RESERVE @@ -1512,11 +1510,11 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, char BIGSTK tempo[HTS_URLMAXSIZE * 2]; strcpybuff(tempo, StringBuff(opt->path_html_utf8)); - strcatbuff(tempo, save); - strcpybuff(save, tempo); + strcatbuff(tempo, afs->save); + strcpybuff(afs->save, tempo); } // vérifier que le nom n'est pas déja pris... - if (liens != NULL) { + if (opt->liens != NULL) { int nom_ok; do { @@ -1530,20 +1528,20 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, printf("\nStart search\n"); #endif - i = hash_read(hash, save, NULL, HASH_STRUCT_FILENAME); // lecture type 0 (sav) + i = hash_read(hash, afs->save, NULL, HASH_STRUCT_FILENAME); // lecture type 0 (sav) if (i >= 0) { - int sameAdr = (strfield2(liens[i]->adr, normadr) != 0); + int sameAdr = (strfield2(heap(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); + // sameFil = ( strfield2(heap(i)->fil, normfil) != 0); //else - sameFil = (strcmp(liens[i]->fil, normfil) == 0); + sameFil = (strcmp(heap(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) { - strcpybuff(save, liens[i]->sav); + if (strcmp(heap(i)->sav, afs->save) != 0) { + strcpybuff(afs->save, heap(i)->sav); } i = 0; #if DEBUG_SAVENAME @@ -1551,7 +1549,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, #endif } else { // utilisé par un AUTRE, changer de nom char BIGSTK tempo[HTS_URLMAXSIZE * 2]; - char *a = save + strlen(save) - 1; + char *a = afs->save + strlen(afs->save) - 1; char *b; int n = 2; char collisionSeparator = ((opt->savename_83 != 2) ? '-' : '_'); @@ -1559,18 +1557,18 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, tempo[0] = '\0'; #if DEBUG_SAVENAME - printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n", liens[i]->fil, + printf("\nWRONG CASE UNMATCH : \n%s\n%s, REDEFINE\n", heap(i)->fil, fil_complete); #endif nom_ok = 0; i = 0; - while((a > save) && (*a != '.') && (*a != '\\') && (*a != '/')) + while((a > afs->save) && (*a != '.') && (*a != '\\') && (*a != '/')) a--; if (*a == '.') - strncatbuff(tempo, save, (int) (a - save)); + strncatbuff(tempo, afs->save, a - afs->save); else - strcatbuff(tempo, save); + strcatbuff(tempo, afs->save); // tester la présence d'un -xx (ex: index-2.html -> index-3.html) b = tempo + strlen(tempo) - 1; @@ -1601,7 +1599,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, if (*a == '.') strcatbuff(tempo, a); - strcpybuff(save, tempo); + strcpybuff(afs->save, tempo); //printf("switched: %s\n",save); @@ -1619,7 +1617,7 @@ int url_savename(char *adr_complete, char *fil_complete, char *save, } /* nom avec md5 urilisé partout */ -void standard_name(char *b, char *dot_pos, char *nom_pos, char *fil_complete, +void standard_name(char *b, const char *dot_pos, const char *nom_pos, const char *fil, int short_ver) { char md5[32 + 2]; @@ -1627,9 +1625,9 @@ void standard_name(char *b, char *dot_pos, char *nom_pos, char *fil_complete, /* Nom */ if (dot_pos) { if (!short_ver) // Noms longs - strncatbuff(b, nom_pos, (int) (dot_pos - nom_pos)); + strncatbuff(b, nom_pos, (dot_pos - nom_pos)); else - strncatbuff(b, nom_pos, min((int) (dot_pos - nom_pos), 8)); + strncatbuff(b, nom_pos, min(dot_pos - nom_pos, 8)); } else { if (!short_ver) // Noms longs strcatbuff(b, nom_pos); @@ -1637,7 +1635,7 @@ void standard_name(char *b, char *dot_pos, char *nom_pos, char *fil_complete, strncatbuff(b, nom_pos, 8); } /* MD5 - 16 bits */ - strncatbuff(b, url_md5(md5, fil_complete), 4); + strncatbuff(b, url_md5(md5, fil), 4); /* Ext */ if (dot_pos) { strcatbuff(b, "."); @@ -1658,11 +1656,11 @@ void standard_name(char *b, char *dot_pos, char *nom_pos, char *fil_complete, } /* Petit md5 */ -char *url_md5(char *digest, char *fil_complete) { +char *url_md5(char *digest, const char *fil) { char *a; digest[0] = '\0'; - a = strchr(fil_complete, '?'); + a = strchr(fil, '?'); if (a) { if (strlen(a)) { char BIGSTK buff[HTS_URLMAXSIZE * 2]; @@ -1677,7 +1675,7 @@ char *url_md5(char *digest, char *fil_complete) { } // interne à url_savename: ajoute une chaîne à une autre avec \ -> / -void url_savename_addstr(char *d, char *s) { +void url_savename_addstr(char *d, const char *s) { int i = (int) strlen(d); while(*s) { |