diff options
author | Xavier Roche <xroche@users.noreply.github.com> | 2014-07-06 08:00:36 +0000 |
---|---|---|
committer | Xavier Roche <xroche@users.noreply.github.com> | 2014-07-06 08:00:36 +0000 |
commit | 46a9b89dd3e97cc77a494f45a0d0fbef785daacb (patch) | |
tree | b7f12eb57a9969a7ef1492e0770b9c9b29156201 /src | |
parent | b6ba5073a553097eb7c456e4d2e9729a7e7ba782 (diff) |
Added hts_has_stopped() flag, added some asserts
Diffstat (limited to 'src')
-rw-r--r-- | src/htscore.c | 10 | ||||
-rw-r--r-- | src/htscoremain.c | 26 | ||||
-rw-r--r-- | src/htslib.c | 35 | ||||
-rw-r--r-- | src/htslib.h | 2 | ||||
-rw-r--r-- | src/htsopt.h | 1 | ||||
-rw-r--r-- | src/httrack-library.h | 1 |
6 files changed, 61 insertions, 14 deletions
diff --git a/src/htscore.c b/src/htscore.c index 0157a63..fbcc972 100644 --- a/src/htscore.c +++ b/src/htscore.c @@ -3657,11 +3657,21 @@ HTSEXT_API int hts_setpause(httrackp * opt, int p) { HTSEXT_API int hts_request_stop(httrackp * opt, int force) { if (opt != NULL) { hts_log_print(opt, LOG_ERROR, "Exit requested by shell or user"); + hts_mutexlock(&opt->state.lock); opt->state.stop = 1; + hts_mutexrelease(&opt->state.lock); } return 0; } +HTSEXT_API int hts_has_stopped(httrackp * opt) { + int ended; + hts_mutexlock(&opt->state.lock); + ended = opt->state.is_ended; + hts_mutexrelease(&opt->state.lock); + return ended; +} + // régler en cours de route les paramètres réglables.. // -1 : erreur //HTSEXT_API int hts_setopt(httrackp* set_opt) { diff --git a/src/htscoremain.c b/src/htscoremain.c index 2cfeb63..df8cc1e 100644 --- a/src/htscoremain.c +++ b/src/htscoremain.c @@ -86,7 +86,11 @@ extern int IPV6_resolver; ptr += (int) (strlen(argv[0])+2); \ argc++ -#define htsmain_free() do { if (url != NULL) { free(url); } } while(0) +#define htsmain_free() do { \ + if (url != NULL) { \ + free(url); \ + } \ +} while(0) #define ensureUrlCapacity(url, urlsize, size) do { \ if (urlsize < size || url == NULL) { \ @@ -126,8 +130,28 @@ HTSEXT_API int hts_main(int argc, char **argv) { return ret; } +static int hts_main_internal(int argc, char **argv, httrackp * opt); + // Main, récupère les paramètres et appelle le robot HTSEXT_API int hts_main2(int argc, char **argv, httrackp * opt) { + int code; + + // Set ended state (3.48-14) + hts_mutexlock(&opt->state.lock); + opt->state.is_ended = 0; + hts_mutexrelease(&opt->state.lock); + + code = hts_main_internal(argc, argv, opt); + + // Set ended state (3.48-14) + hts_mutexlock(&opt->state.lock); + opt->state.is_ended = 1; + hts_mutexrelease(&opt->state.lock); + + return code; +} + +static int hts_main_internal(int argc, char **argv, httrackp * opt) { char **x_argv = NULL; // Patch pour argv et argc: en cas de récupération de ligne de commande char *x_argvblk = NULL; // (reprise ou update) int x_ptr = 0; // offset diff --git a/src/htslib.c b/src/htslib.c index b96d4b2..9d55546 100644 --- a/src/htslib.c +++ b/src/htslib.c @@ -4518,7 +4518,7 @@ int hts_read(htsblk * r, char *buff, int size) { // 'RX98 // 'capsule' contenant uniquement le cache -t_dnscache *_hts_cache(httrackp * opt) { +t_dnscache *hts_cache(httrackp * opt) { assertf(opt != NULL); if (opt->state.dns_cache == NULL) { opt->state.dns_cache = (t_dnscache *) malloct(sizeof(t_dnscache)); @@ -4551,9 +4551,12 @@ void hts_cache_free(t_dnscache *const root) { // si h_length==0 alors le nom n'existe pas dans le dns static SOCaddr* hts_ghbn(const t_dnscache *cache, const char *const iadr, SOCaddr *const addr) { assertf(addr != NULL); + assertf(iadr != NULL); + if (*iadr == '\0') { + return NULL; + } for(; cache != NULL; cache = cache->n) { assertf(cache != NULL); - assertf(iadr != NULL); if (cache->iadr != NULL && strcmp(cache->iadr, iadr) == 0) { // ok trouvé if (cache->host_length > 0) { // entrée valide SOCaddr_copyaddr2(*addr, cache->host_addr, cache->host_length); @@ -4657,9 +4660,9 @@ HTSEXT_API int check_hostname_dns(const char *const hostname) { // Needs locking // cache dns interne à HTS // ** FREE A FAIRE sur la chaine static SOCaddr* hts_dns_resolve_(httrackp * opt, const char *_iadr, - SOCaddr *const addr, const char **error) { + SOCaddr *const addr, const char **error) { char BIGSTK iadr[HTS_URLMAXSIZE * 2]; - t_dnscache *cache = _hts_cache(opt); // adresse du cache + t_dnscache *cache = hts_cache(opt); // adresse du cache SOCaddr *sa; assertf(opt != NULL); @@ -4696,16 +4699,17 @@ static SOCaddr* hts_dns_resolve_(httrackp * opt, const char *_iadr, /* attempt to store new entry */ cache->n = (t_dnscache *) calloct(1, sizeof(t_dnscache)); if (cache->n != NULL) { - strcpybuff(cache->n->iadr, iadr); + t_dnscache *const next = cache->n; + strcpybuff(next->iadr, iadr); if (sa != NULL) { - cache->n->host_length = SOCaddr_size(*sa); - assertf(cache->n->host_length < sizeof(cache->n->host_addr)); - memcpy(cache->n->host_addr, &SOCaddr_sockaddr(*sa), cache->n->host_length); + next->host_length = SOCaddr_size(*sa); + assertf(next->host_length < sizeof(next->host_addr)); + memcpy(next->host_addr, &SOCaddr_sockaddr(*sa), next->host_length); } else { - cache->n->host_addr[0] = '\0'; - cache->n->host_length = 0; // non existant dans le dns + next->host_addr[0] = '\0'; + next->host_length = 0; // non existant dans le dns } - cache->n->n = NULL; + next->n = NULL; return sa; } @@ -5475,6 +5479,8 @@ HTSEXT_API httrackp *hts_create_opt(void) { opt->bypass_limits = 0; // enforce limits by default opt->state.stop = 0; // stopper opt->state.exit_xh = 0; // abort + // + opt->state.is_ended = 0; /* Alocated buffers */ @@ -5538,8 +5544,13 @@ HTSEXT_API void hts_free_opt(httrackp * opt) { /* Cache */ if (opt->state.dns_cache != NULL) { - t_dnscache *const root = opt->state.dns_cache; + t_dnscache *root; + + hts_mutexlock(&opt->state.lock); + root = opt->state.dns_cache; opt->state.dns_cache = NULL; + hts_mutexrelease(&opt->state.lock); + hts_cache_free(root); } diff --git a/src/htslib.h b/src/htslib.h index d89e68d..aa5d341 100644 --- a/src/htslib.h +++ b/src/htslib.h @@ -217,7 +217,7 @@ int ftp_available(void); #if HTS_DNSCACHE void hts_cache_free(t_dnscache *const cache); -t_dnscache *_hts_cache(httrackp * opt); +t_dnscache *hts_cache(httrackp * opt); #endif // outils divers diff --git a/src/htsopt.h b/src/htsopt.h index cc024c9..6581045 100644 --- a/src/htsopt.h +++ b/src/htsopt.h @@ -251,6 +251,7 @@ struct htsoptstate { char HTbuff[2048]; unsigned int debug_state; unsigned int tmpnameid; /* 3.41 */ + int is_ended; /* 3.48-14 */ }; /* Library handles */ diff --git a/src/httrack-library.h b/src/httrack-library.h index cbc7d86..248c370 100644 --- a/src/httrack-library.h +++ b/src/httrack-library.h @@ -186,6 +186,7 @@ HTSEXT_API void hts_cancel_test(httrackp * opt); HTSEXT_API void hts_cancel_parsing(httrackp * opt); HTSEXT_API void hts_cancel_test(httrackp * opt); HTSEXT_API void hts_cancel_parsing(httrackp * opt); +HTSEXT_API int hts_has_stopped(httrackp * opt); /* Tools */ HTSEXT_API int structcheck(const char *path); |