diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2013-07-09 20:19:53 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2013-07-09 20:19:53 +0000 |
commit | e4b71bb7d41a7daab67322a567c6ddafafe383fa (patch) | |
tree | d46750fbe4ee09ed21f1106cb9814d1b0e58ee7a /src | |
parent | 39501c8aeb7436296c6d4fc1f52c58e52e6101ef (diff) |
Attempt to replace tmpnam()
Diffstat (limited to 'src')
-rw-r--r-- | src/htsback.c | 109 | ||||
-rw-r--r-- | src/htsparse.c | 1 |
2 files changed, 67 insertions, 43 deletions
diff --git a/src/htsback.c b/src/htsback.c index 9558f3d..d5460fe 100644 --- a/src/htsback.c +++ b/src/htsback.c @@ -456,6 +456,45 @@ int back_nsoc_overall(struct_back * sback) { return n; } +/* generate temporary file on lien_back */ +static int create_back_tmpfile(httrackp * opt, lien_back *const back) { +/* TEMPORARY */ +/* TEMPORARY */ + char *const tmp = tempnam(StringBuff(opt->path_html_utf8), "httrack_temporaryGzipFile_"); + + if (tmp != NULL) { + strcpybuff(back->tmpfile_buffer, tmp); + free(tmp); + back->tmpfile = back->tmpfile_buffer; +return 0; + } else { + back->tmpfile = NULL; + } +/* TEMPORARY */ +/* TEMPORARY */ + + // do not use tempnam() but a regular filename + back->tmpfile_buffer[0] = '\0'; + if (back->url_sav != NULL && back->url_sav[0] != '\0') { + snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer), "%s.z", + back->url_sav); + back->tmpfile = back->tmpfile_buffer; + if (structcheck(back->tmpfile) != 0) { + hts_log_print(opt, LOG_WARNING, "can not create directory to %s", + back->tmpfile); + return -1; + } + } else { + snprintf(back->tmpfile_buffer, sizeof(back->tmpfile_buffer), + "%s/tmp%d.z", StringBuff(opt->path_html_utf8), + opt->state.tmpnameid++); + back->tmpfile = back->tmpfile_buffer; + } + /* OK */ + hts_log_print(opt, LOG_TRACE, "produced temporary name %s", back->tmpfile); + return 0; +} + // objet (lien) téléchargé ou transféré depuis le cache // // fermer les paramètres de transfert, @@ -506,27 +545,11 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback, back[p].compressed_size = back[p].r.size; // en mémoire -> passage sur disque if (!back[p].r.is_write) { -#if 1 -#ifdef _WIN32 -#undef tempnam -#define tempnam _tempnam -#endif - char *const tmp = tempnam(NULL, "httrack_temporaryGzipFile_"); - - if (tmp != NULL) { - strcpybuff(back[p].tmpfile_buffer, tmp); - free(tmp); - back[p].tmpfile = back[p].tmpfile_buffer; - } else { - back[p].tmpfile = NULL; - } -#else - back[p].tmpfile_buffer[0] = '\0'; - back[p].tmpfile = tmpnam(back[p].tmpfile_buffer); -#endif - if (back[p].tmpfile != NULL && back[p].tmpfile[0] != '\0') { - /* note: tmpfile is a local system filename */ - back[p].r.out = fopen(back[p].tmpfile, "wb"); + // do not use tempnam() but a regular filename + if (create_back_tmpfile(opt, &back[p]) == 0) { + assert(back[p].tmpfile != NULL); + /* note: tmpfile is utf-8 */ + back[p].r.out = FOPEN(back[p].tmpfile, "wb"); if (back[p].r.out) { if ((back[p].r.adr) && (back[p].r.size > 0)) { if (fwrite @@ -542,11 +565,15 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback, strcpybuff(back[p].r.msg, "Empty compressed file"); } } else { + snprintf(back[p].r.msg, sizeof(back[p].r.msg), + "Open error when decompressing (can not create temporary file %s)", + back[p].tmpfile); back[p].tmpfile[0] = '\0'; back[p].r.statuscode = STATUSCODE_INVALID; - strcpybuff(back[p].r.msg, - "Open error when decompressing (can not create a temporary file)"); } + } else { + snprintf(back[p].r.msg, sizeof(back[p].r.msg), + "Open error when decompressing (can not generate a temporary file)"); } } // fermer fichier sortie @@ -555,7 +582,7 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback, back[p].r.out = NULL; } // décompression - if (back[p].tmpfile != NULL && back[p].tmpfile[0] != '\0') { + if (back[p].tmpfile != NULL) { if (back[p].url_sav[0]) { LLint size; @@ -705,6 +732,9 @@ int back_finalize(httrackp * opt, cache_back * cache, struct_back * sback, if (strcmp(back[p].url_fil, "/robots.txt") != 0) { HTS_STAT.stat_bytes += back[p].r.size; HTS_STAT.stat_files++; + hts_log_print(opt, LOG_TRACE, "added file %s%s => %s", + back[p].url_adr, back[p].url_fil, + back[p].url_sav != NULL ? back[p].url_sav : ""); } if ((!back[p].r.notmodified) && (opt->is_update)) { HTS_STAT.stat_updated_files++; // page modifiée @@ -1293,6 +1323,7 @@ int back_delete(httrackp * opt, cache_back * cache, struct_back * sback, back[p].url_adr, back[p].url_fil, back[p].url_sav); } if (cache != NULL) { + //hts_log_print(opt, LOG_TRACE, "finalizing from back_delete"); back_finalize(opt, cache, sback, p); } } @@ -1684,6 +1715,7 @@ int back_add(struct_back * sback, httrackp * opt, cache_back * cache, char *adr, // finalize transfer if (!test) { if (back[p].r.statuscode > 0) { + hts_log_print(opt, LOG_TRACE, "finalizing in back_add"); back_finalize(opt, cache, sback, p); } } @@ -2811,6 +2843,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, back_set_finished(sback, i); // finalize transfer if (back[i].r.statuscode > 0) { + hts_log_print(opt, LOG_TRACE, "finalizing ftp"); back_finalize(opt, cache, sback, i); } } @@ -2821,6 +2854,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, back_set_finished(sback, i); // finalize transfer if (back[i].r.statuscode > 0) { + hts_log_print(opt, LOG_TRACE, "finalizing ftp"); back_finalize(opt, cache, sback, i); } } else if ((back[i].status > 0) && (back[i].status < 1000)) { // en réception http @@ -2878,25 +2912,9 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, (strfield (get_ext(catbuff, back[i].url_sav), "gz") == 0) ) { -#if 1 -#ifdef _WIN32 -#undef tempnam -#define tempnam _tempnam -#endif - char *const tmp = - tempnam(NULL, "httrack_temporaryGzipFile_"); - if (tmp != NULL) { - strcpybuff(back[i].tmpfile_buffer, tmp); - free(tmp); - back[i].tmpfile = back[i].tmpfile_buffer; - } else { - back[i].tmpfile = NULL; - } -#else - back[i].tmpfile_buffer[0] = '\0'; - back[i].tmpfile = tmpnam(back[p].tmpfile_buffer); -#endif - if (back[i].tmpfile != NULL && back[i].tmpfile[0]) { + if (create_back_tmpfile(opt, &back[i]) == 0) { + assert(back[i].tmpfile != NULL); + /* note: tmpfile is utf-8 */ if ((back[i].r.out = FOPEN(back[i].tmpfile, "wb")) == NULL) { last_errno = errno; @@ -3080,6 +3098,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, // finalize transfer if (back[i].r.statuscode > 0 && !IS_DELAYED_EXT(back[i].url_sav) ) { + hts_log_print(opt, LOG_TRACE, "finalizing regular file"); back_finalize(opt, cache, sback, i); } @@ -3237,6 +3256,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, // finalize transfer if not temporary if (!IS_DELAYED_EXT(back[i].url_sav)) { + hts_log_print(opt, LOG_TRACE, "finalizing at chunk end"); back_finalize(opt, cache, sback, i); } else { if (back[i].r.statuscode == HTTP_OK) { @@ -3700,6 +3720,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, // finalize //file_notify(back[i].url_adr, back[i].url_fil, back[i].url_sav, 0, 0, back[i].r.notmodified); // not modified if (back[i].r.statuscode > 0) { + hts_log_print(opt, LOG_TRACE, "finalizing after cache load"); back_finalize(opt, cache, sback, i); } #if DEBUGCA @@ -3733,6 +3754,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, back_set_finished(sback, i); // finalize if (back[i].r.statuscode > 0) { + hts_log_print(opt, LOG_TRACE, "finalizing redirect & 4xx"); back_finalize(opt, cache, sback, i); } #endif @@ -3859,6 +3881,7 @@ void back_wait(struct_back * sback, httrackp * opt, cache_back * cache, && (back[i].r.adr = (char *) malloct(2))) { back[i].r.adr[0] = 0; } + hts_log_print(opt, LOG_TRACE, "finalizing empty"); back_finalize(opt, cache, sback, i); } else if (!back[i].r.is_chunk) { // pas de chunk //if (back[i].r.http11!=2) { // pas de chunk diff --git a/src/htsparse.c b/src/htsparse.c index 3320886..4acc336 100644 --- a/src/htsparse.c +++ b/src/htsparse.c @@ -4904,6 +4904,7 @@ int hts_wait_delayed(htsmoduleStruct * str, char *adr, char *fil, char *save, /* Finalize now as we have the type */ if (back[b].status == STATUS_READY) { if (!back[b].finalized) { + hts_log_print(opt, LOG_TRACE, "finalizing as we have the type"); back_finalize(opt, cache, sback, b); } } |