summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Roche <xroche@users.noreply.github.com>2014-07-06 08:00:36 +0000
committerXavier Roche <xroche@users.noreply.github.com>2014-07-06 08:00:36 +0000
commit46a9b89dd3e97cc77a494f45a0d0fbef785daacb (patch)
treeb7f12eb57a9969a7ef1492e0770b9c9b29156201
parentb6ba5073a553097eb7c456e4d2e9729a7e7ba782 (diff)
Added hts_has_stopped() flag, added some asserts
-rw-r--r--src/htscore.c10
-rw-r--r--src/htscoremain.c26
-rw-r--r--src/htslib.c35
-rw-r--r--src/htslib.h2
-rw-r--r--src/htsopt.h1
-rw-r--r--src/httrack-library.h1
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);