From 8712f3f01a5acaa5426c03fc4510f18985b84b66 Mon Sep 17 00:00:00 2001 From: Bjørn Mork Date: Sat, 4 Mar 2017 21:05:37 +0100 Subject: ripe-atlas-fw: imported version 4750 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Bjørn Mork --- eperd/eooqd.c | 82 +++++++++++++++++++++++++++++++----- eperd/eperd.c | 60 +++++++++++++++++++++++--- eperd/evtdig.c | 53 +++++++++++++++-------- eperd/evtraceroute.c | 1 + eperd/ntp.c | 12 ++++-- eperd/readresolv.c | 116 +++++++++++++-------------------------------------- eperd/readresolv.h | 4 +- eperd/traceroute.c | 17 ++++++-- 8 files changed, 215 insertions(+), 130 deletions(-) (limited to 'eperd') diff --git a/eperd/eooqd.c b/eperd/eooqd.c index ed8ea64..8c11f62 100644 --- a/eperd/eooqd.c +++ b/eperd/eooqd.c @@ -28,6 +28,9 @@ #define BARRIER_CMD "barrier" #define POST_CMD "post" +#define RELOAD_RESOLV_CONF_CMD "reload_resolv_conf" + +#define RESOLV_CONF "/etc/resolv.conf" struct slot { @@ -68,6 +71,9 @@ static struct builtin static const char *atlas_id; static const char *queue_id; +static char *resolv_conf; +static char output_filename[80]; + static void report(const char *fmt, ...); static void report_err(const char *fmt, ...); @@ -88,18 +94,22 @@ int eooqd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int eooqd_main(int argc, char *argv[]) { int r; - char *pid_file_name, *instance_id_str; + size_t len; + char *pid_file_name, *interface_name, *instance_id_str; char *check; struct event *checkQueueEvent, *rePostEvent; struct timeval tv; struct rlimit limit; + struct stat sb; atlas_id= NULL; + interface_name= NULL; instance_id_str= NULL; pid_file_name= NULL; queue_id= ""; - (void)getopt32(argv, "A:i:P:q:", &atlas_id, &instance_id_str, + (void)getopt32(argv, "A:I:i:P:q:", &atlas_id, + &interface_name, &instance_id_str, &pid_file_name, &queue_id); if (argc != optind+1) @@ -120,6 +130,28 @@ int eooqd_main(int argc, char *argv[]) } } + if (interface_name) + { + len= strlen(RESOLV_CONF) + 1 + + strlen(interface_name) + 1; + resolv_conf= malloc(len); + snprintf(resolv_conf, len, "%s.%s", + RESOLV_CONF, interface_name); + + /* Check if this resolv.conf exists. If it doen't, switch + * to the standard one. + */ + if (stat(resolv_conf, &sb) == -1) + { + free(resolv_conf); + resolv_conf= strdup(RESOLV_CONF); + } + } + else + { + resolv_conf= strdup(RESOLV_CONF); + } + if(pid_file_name) { write_pidfile(pid_file_name); @@ -145,6 +177,9 @@ int eooqd_main(int argc, char *argv[]) sizeof(state->curr_qfile)); strlcat(state->curr_qfile, SUFFIX, sizeof(state->curr_qfile)); + snprintf(output_filename, sizeof(output_filename), + OOQD_OUT_PREFIX "%s/ooq.out", queue_id); + signal(SIGQUIT, SIG_DFL); limit.rlim_cur= RLIM_INFINITY; limit.rlim_max= RLIM_INFINITY; @@ -156,13 +191,32 @@ int eooqd_main(int argc, char *argv[]) { crondlog(DIE9 "event_base_new failed"); /* exits */ } - DnsBase= evdns_base_new(EventBase, 1 /*initialize*/); + DnsBase= evdns_base_new(EventBase, 0 /*initialize*/); if (!DnsBase) { event_base_free(EventBase); crondlog(DIE9 "evdns_base_new failed"); /* exits */ } + if (interface_name) + { + r= evdns_base_set_interface(DnsBase, interface_name); + if (r == -1) + { + event_base_free(EventBase); + crondlog(DIE9 "evdns_base_set_interface failed"); + /* exits */ + } + } + + r = evdns_base_resolv_conf_parse(DnsBase, DNS_OPTIONS_ALL, + resolv_conf); + if (r == -1) + { + event_base_free(EventBase); + crondlog(DIE9 "evdns_base_resolv_conf_parse failed"); /* exits */ + } + checkQueueEvent= event_new(EventBase, -1, EV_TIMEOUT|EV_PERSIST, checkQueue, NULL); if (!checkQueueEvent) @@ -190,7 +244,6 @@ static void checkQueue(evutil_socket_t fd UNUSED_PARAM, { int r; struct stat sb; - char filename[80]; if (!state->curr_file) { @@ -246,9 +299,7 @@ static void checkQueue(evutil_socket_t fd UNUSED_PARAM, break; /* Wait for barrier to complete */ } - snprintf(filename, sizeof(filename), - OOQD_OUT_PREFIX "%s/ooq.out", queue_id); - check_resolv_conf2(filename, atlas_id); + check_resolv_conf2(output_filename, atlas_id); } static int add_line(void) @@ -328,6 +379,14 @@ static int add_line(void) return 0; } + /* Check for the reload resolv.conf command */ + if (strcmp(cmdline, RELOAD_RESOLV_CONF_CMD) == 0) + { + /* Trigger a reload */ + check_resolv_conf2(output_filename, atlas_id); + return 0; /* Done */ + } + cmdstate= NULL; reason= NULL; for (bp= builtin_cmds; bp->cmd != NULL; bp++) @@ -555,7 +614,6 @@ static void cmddone(void *cmdstate) } } -#define RESOLV_CONF "/etc/resolv.conf" static void check_resolv_conf2(const char *out_file, const char *atlasid) { static time_t last_time= -1; @@ -564,7 +622,7 @@ static void check_resolv_conf2(const char *out_file, const char *atlasid) FILE *fn; struct stat sb; - r= stat(RESOLV_CONF, &sb); + r= stat(resolv_conf, &sb); if (r == -1) { crondlog(LVL8 "error accessing resolv.conf: %s", @@ -573,10 +631,14 @@ static void check_resolv_conf2(const char *out_file, const char *atlasid) } if (sb.st_mtime == last_time) + { + crondlog(LVL7 "check_resolv_conf2: no change (time %d)", + sb.st_mtime); return; /* resolv.conf did not change */ + } evdns_base_clear_nameservers_and_suspend(DnsBase); r= evdns_base_resolv_conf_parse(DnsBase, DNS_OPTIONS_ALL, - RESOLV_CONF); + resolv_conf); evdns_base_resume(DnsBase); if ((r != 0 || last_time != -1) && out_file != NULL) diff --git a/eperd/eperd.c b/eperd/eperd.c index 9c602c6..83aff15 100644 --- a/eperd/eperd.c +++ b/eperd/eperd.c @@ -57,6 +57,8 @@ #define URANDOM_DEV "/dev/urandom" #define ATLAS_FW_VERSION "/home/atlas/state/FIRMWARE_APPS_VERSION" +#define RESOLV_CONF "/etc/resolv.conf" + struct CronLine { struct CronLine *cl_Next; char *cl_Shell; /* shell command */ @@ -121,6 +123,7 @@ struct globals G; static int do_kick_watchdog; static char *out_filename= NULL; static char *atlas_id= NULL; +static char *resolv_conf; static void CheckUpdates(evutil_socket_t fd, short what, void *arg); static void CheckUpdatesHour(evutil_socket_t fd, short what, void *arg); @@ -257,11 +260,14 @@ int eperd_main(int argc UNUSED_PARAM, char **argv) unsigned opt; int r, fd; unsigned seed; + size_t len; struct event *updateEventMin, *updateEventHour; struct timeval tv; struct rlimit limit; + struct stat sb; const char *PidFileName = NULL; + char *interface_name= NULL; atexit(my_exit); @@ -270,8 +276,9 @@ int eperd_main(int argc UNUSED_PARAM, char **argv) /* "-b after -f is ignored", and so on for every pair a-b */ opt_complementary = "f-b:b-f:S-L:L-S" USE_FEATURE_PERD_D(":d-l") ":i+:l+:d+"; /* -i, -l and -d have numeric param */ - opt = getopt32(argv, "i:l:L:fc:A:DP:" USE_FEATURE_PERD_D("d:") "O:", - &instance_id, &LogLevel, &LogFile, &CDir, + opt = getopt32(argv, "I:i:l:L:fc:A:DP:" USE_FEATURE_PERD_D("d:") "O:", + &interface_name, &instance_id, &LogLevel, + &LogFile, &CDir, &atlas_id, &PidFileName USE_FEATURE_PERD_D(,&LogLevel), &out_filename); /* both -d N and -l N set the same variable: LogLevel */ @@ -294,6 +301,29 @@ int eperd_main(int argc UNUSED_PARAM, char **argv) logmode = LOGMODE_SYSLOG; } + if (interface_name) + { + len= strlen(RESOLV_CONF) + 1 + + strlen(interface_name) + 1; + resolv_conf= malloc(len); + snprintf(resolv_conf, len, "%s.%s", + RESOLV_CONF, interface_name); + + /* Check if this resolv.conf exists. If it doen't, switch + * to the standard one. + */ + if (stat(resolv_conf, &sb) == -1) + { + free(resolv_conf); + resolv_conf= strdup(RESOLV_CONF); + } + } + else + { + resolv_conf= strdup(RESOLV_CONF); + } + + do_kick_watchdog= !!(opt & OPT_D); xchdir(CDir); @@ -312,12 +342,31 @@ int eperd_main(int argc UNUSED_PARAM, char **argv) { crondlog(DIE9 "event_base_new failed"); /* exits */ } - DnsBase= evdns_base_new(EventBase, 1 /*initialize*/); + DnsBase= evdns_base_new(EventBase, 0 /*!initialize*/); if (!DnsBase) { crondlog(DIE9 "evdns_base_new failed"); /* exits */ } + if (interface_name) + { + r= evdns_base_set_interface(DnsBase, interface_name); + if (r == -1) + { + event_base_free(EventBase); + crondlog(DIE9 "evdns_base_set_interface failed"); + /* exits */ + } + } + + r = evdns_base_resolv_conf_parse(DnsBase, DNS_OPTIONS_ALL, + resolv_conf); + if (r == -1) + { + event_base_free(EventBase); + crondlog(DIE9 "evdns_base_resolv_conf_parse failed"); /* exits */ + } + fd= open(URANDOM_DEV, O_RDONLY); /* Best effort, just ignore errors */ @@ -591,7 +640,6 @@ static void SynchronizeFile(const char *fileName) DeleteFile(); } -#define RESOLV_CONF "/etc/resolv.conf" static void check_resolv_conf(void) { static time_t last_time= -1; @@ -600,7 +648,7 @@ static void check_resolv_conf(void) FILE *fn; struct stat sb; - r= stat(RESOLV_CONF, &sb); + r= stat(resolv_conf, &sb); if (r == -1) { crondlog(LVL8 "error accessing resolv.conf: %s", @@ -612,7 +660,7 @@ static void check_resolv_conf(void) return; /* resolv.conf did not change */ evdns_base_clear_nameservers_and_suspend(DnsBase); r= evdns_base_resolv_conf_parse(DnsBase, DNS_OPTIONS_ALL, - RESOLV_CONF); + resolv_conf); evdns_base_resume(DnsBase); if ((r != 0 || last_time != -1) && out_filename) diff --git a/eperd/evtdig.c b/eperd/evtdig.c index df223ff..c5879de 100644 --- a/eperd/evtdig.c +++ b/eperd/evtdig.c @@ -231,8 +231,6 @@ struct tdig_base { struct query_state *qry_head; struct event statsReportEvent; - int resolv_max; - char nslist[MAXNS][INET6_ADDRSTRLEN * 2]; counter_t sendfail; /* # of failed sendto() */ counter_t sentok; /* # of successful sendto() */ @@ -297,6 +295,10 @@ struct query_state { char * server_name; char *out_filename ; + /* Contents of resolv.conf during a measurement */ + int resolv_max; + char *nslist[MAXNS]; + /* For fuzzing */ char *response_out; char *response_in; @@ -1343,10 +1345,6 @@ static bool argProcess (int argc, char *argv[], struct query_state *qry ) { if( qry->opt_resolv_conf) { qry->resolv_i = 0; - get_local_resolvers(tdig_base->nslist, &tdig_base->resolv_max); - if(tdig_base->resolv_max ) { - qry->server_name = strdup(tdig_base->nslist[qry->resolv_i]); - } } else if (optind != argc-1) { crondlog(LVL9 "ERROR no server IP address in input"); @@ -1911,7 +1909,6 @@ struct tdig_base * tdig_base_new(struct event_base *event_base) tdig_base->recvbytes = 0; tdig_base->timeout = 0; tdig_base->activeqry = 0; - tdig_base->resolv_max = 0; memset(tdig_base, 0, sizeof(struct tdig_base)); tdig_base->event_base = event_base; @@ -1970,17 +1967,20 @@ void tdig_start (void *arg) /* Get time in case we don't send any packet */ qry->xmit_time= time(NULL); qry->resolv_i = 0; - crondlog(LVL5 "RESOLV QUERY FREE %s resolv_max %d", qry->server_name, tdig_base->resolv_max); + crondlog(LVL5 "RESOLV QUERY FREE %s resolv_max %d", qry->server_name, qry->resolv_max); if( qry->opt_resolv_conf) { - get_local_resolvers (tdig_base->nslist, &tdig_base->resolv_max); - crondlog(LVL5 "AAA RESOLV QUERY FREE %s resolv_max %d %d", qry->server_name, tdig_base->resolv_max, qry->resolv_i); - if(tdig_base->resolv_max ) { + get_local_resolvers (qry->nslist, + &qry->resolv_max, + qry->infname); + crondlog(LVL5 "AAA RESOLV QUERY FREE %s resolv_max %d %d", qry->server_name, qry->resolv_max, qry->resolv_i); + if(qry->resolv_max ) { free(qry->server_name); qry->server_name = NULL; - qry->server_name = strdup(tdig_base->nslist[qry->resolv_i]); + qry->server_name = qry->nslist[qry->resolv_i]; + qry->nslist[qry->resolv_i]= NULL; } else { - crondlog(LVL5 "AAA RESOLV QUERY FREE %s resolv_max is zero %d i %d", qry->server_name, tdig_base->resolv_max, qry->resolv_i); + crondlog(LVL5 "AAA RESOLV QUERY FREE %s resolv_max is zero %d i %d", qry->server_name, qry->resolv_max, qry->resolv_i); free(qry->server_name); qry->server_name = NULL; snprintf(line, DEFAULT_LINE_LENGTH, "\"nameserver\": \"no local resolvers found\""); @@ -2201,6 +2201,7 @@ static void ChangetoDnsNameFormat(u_char * dns, char* qry) static void free_qry_inst(struct query_state *qry) { + int i; struct timeval asap = { 1, 0 }; BLURT(LVL5 "freeing instance of %s ", qry->server_name); @@ -2248,18 +2249,27 @@ static void free_qry_inst(struct query_state *qry) if ( qry->opt_resolv_conf) { // this loop goes over servers in /etc/resolv.conf // select the next server and restart - if(qry->resolv_i < tdig_base->resolv_max) { + if(qry->resolv_i < qry->resolv_max) { if(qry->server_name) { free (qry->server_name); qry->server_name = NULL; } - qry->server_name = strdup(tdig_base->nslist[qry->resolv_i]); + qry->server_name = strdup(qry->nslist[qry->resolv_i]); qry->qst = STATUS_NEXT_QUERY; evtimer_add(&qry->next_qry_timer, &asap); return; } } + for (i= 0; inslist[i]) + { + free(qry->nslist[i]); + qry->nslist[i]= NULL; + } + } + switch(qry->qst){ case STATUS_RETRANSMIT_QUERY: break; @@ -2281,6 +2291,7 @@ static void free_qry_inst(struct query_state *qry) static int tdig_delete(void *state) { + int i; struct query_state *qry; qry = state; @@ -2343,6 +2354,14 @@ static int tdig_delete(void *state) free(qry->server_name); qry->server_name = NULL; } + for (i= 0; inslist[i]) + { + free(qry->nslist[i]); + qry->nslist[i]= NULL; + } + } if (qry->udp_fd != -1) { event_del(&qry->event); @@ -2451,7 +2470,7 @@ void printReply(struct query_state *qry, int wire_size, unsigned char *result) if ( qry->opt_resolv_conf ) { JD (subid, (qry->resolv_i+1)); - JD (submax, qry->base->resolv_max); + JD (submax, qry->resolv_max); } if( qry->ressent && qry->server_name) @@ -2655,7 +2674,7 @@ void printReply(struct query_state *qry, int wire_size, unsigned char *result) if(qry->opt_resolv_conf){ qry->resolv_i++; - if(qry->resolv_i >= tdig_base->resolv_max) { + if(qry->resolv_i >= qry->resolv_max) { write_out = TRUE; if(qry->opt_rset) { AS ("]"); /* reseultset : [{}] */ diff --git a/eperd/evtraceroute.c b/eperd/evtraceroute.c index d5e0d36..c596e3c 100644 --- a/eperd/evtraceroute.c +++ b/eperd/evtraceroute.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "eperd.h" diff --git a/eperd/ntp.c b/eperd/ntp.c index fb788c2..c1d509a 100644 --- a/eperd/ntp.c +++ b/eperd/ntp.c @@ -1830,12 +1830,11 @@ static void traceroute_start2(void *state) ntpstate= state; - if (ntpstate->busy) + if (!ntpstate->busy) { - printf("ntp_start: busy, can't start\n"); + printf("ntp_start: not busy, can't continue\n"); return; } - ntpstate->busy= 1; ntpstate->min= ULONG_MAX; ntpstate->max= 0; @@ -2070,6 +2069,13 @@ static void ntp_start(void *state) ntpstate= state; + if (ntpstate->busy) + { + printf("ntp_start: busy, can't start\n"); + return; + } + ntpstate->busy= 1; + if (ntpstate->response_out) { ntpstate->resp_file_out= fopen(ntpstate->response_out, "w"); diff --git a/eperd/readresolv.c b/eperd/readresolv.c index 9d04866..df464bc 100644 --- a/eperd/readresolv.c +++ b/eperd/readresolv.c @@ -7,18 +7,15 @@ #include "libbb.h" #include "resolv.h" #include "eperd.h" +#include "readresolv.h" #include -static void nameserver_ip_add (char *nsentry, char *ip_as_string) +static void nameserver_ip_add (char **nsentry, char *ip_as_string) { - - strncpy (nsentry, ip_as_string, LINEL); - // printf("AA added nameserver %s\n", ip_as_string); - // printf("AA added nameserver to ns %s\n", nsentry); - return; + *nsentry= strdup(ip_as_string); } -static int resolv_conf_parse_line (char *nsentry, char *line) +static int resolv_conf_parse_line (char **nsentry, char *line) { #define NEXT_TOKEN strtok_r(NULL, delims, &strtok_state) @@ -32,7 +29,7 @@ static int resolv_conf_parse_line (char *nsentry, char *line) char *const nameserver = NEXT_TOKEN; if (nameserver) { if(nameserver[(strlen(nameserver) - 1)] == '\n') - nameserver[(strlen(nameserver) - 1)] = NULL; + nameserver[(strlen(nameserver) - 1)] = '\0'; nameserver_ip_add(nsentry, nameserver); //printf("AA added nameserver %s\n", nsentry); return 1; @@ -41,108 +38,51 @@ static int resolv_conf_parse_line (char *nsentry, char *line) return 0; } -void get_local_resolvers(char nslist[MAXNS][INET6_ADDRSTRLEN * 2], - int *resolv_max) +void get_local_resolvers(char *nslist[MAXNS], int *resolv_max, char *ifname) { #ifndef RESOLV_CONF #define RESOLV_CONF "/etc/resolv.conf" #endif char buf[LINEL]; + char filename[80]; char *buf_start; int i = 0; - time_t now; - int r; struct stat sb; + FILE *R; - static resolv_last_check = -1; - static time_t last_time= -1; - - now = time(NULL); - - if(*resolv_max){ - if ( pow (resolv_last_check - now, 2) > 3) { - crondlog(LVL5 "check the %s", RESOLV_CONF); - } - else { - return; - } - - } - - - r = stat(RESOLV_CONF, &sb); - if (r == -1) - { - crondlog(LVL8 "error accessing resolv.conf: %s", - strerror(errno)); - return; - } - - resolv_last_check = now; - - if (last_time == sb.st_mtime) + if (ifname) { - /* nothing changed */ - crondlog(LVL5 "re-read %s. not reading this time", RESOLV_CONF); - return; - } - else { - crondlog(LVL5 "re-read %s . it has changed", RESOLV_CONF); - } - - FILE *R = fopen (RESOLV_CONF, "r"); - if (R != NULL) { - while ( (fgets (buf, LINEL, R)) && (i < MAXNS)) { - buf_start = buf; - if(resolv_conf_parse_line(nslist[i], buf) ) { - crondlog(LVL5 "parsed file %s , line %s i=%d", RESOLV_CONF, buf_start, i); - i++; - } - else - crondlog(LVL5 "ERROR failed to parse from %s i=%d, line %s", RESOLV_CONF, i, buf_start); + snprintf(filename, sizeof(filename), "%s.%s", + RESOLV_CONF, ifname); + + /* Check if it exists */ + if (stat(filename, &sb) == -1) + { + crondlog(LVL8 "get_local_resolvers: stat of %s failed: %s", + filename, strerror(errno)); + /* Fall back to resolv.conf */ + strlcpy(filename, RESOLV_CONF, sizeof(filename)); } - fclose (R); } - - last_time = sb.st_mtime; - - *resolv_max = i; - return; -} - -void get_local_resolvers_nocache(char nslist[MAXNS][INET6_ADDRSTRLEN * 2], - int *resolv_max) -{ - -#ifndef RESOLV_CONF -#define RESOLV_CONF "/etc/resolv.conf" -#endif - FILE *R; - char buf[LINEL]; - char *buf_start; - int i = 0; - int r; - struct stat sb; - - r = stat(RESOLV_CONF, &sb); - if (r == -1) + else { - crondlog(LVL8 "error accessing resolv.conf: %s", - strerror(errno)); - return; + /* Just use resolv.conf */ + strlcpy(filename, RESOLV_CONF, sizeof(filename)); } - R = fopen (RESOLV_CONF, "r"); + crondlog(LVL8 "get_local_resolvers: using %s", filename); + + R = fopen (filename, "r"); if (R != NULL) { while ( (fgets (buf, LINEL, R)) && (i < MAXNS)) { buf_start = buf; - if(resolv_conf_parse_line(nslist[i], buf) ) { - crondlog(LVL5 "parsed file %s , line %s i=%d", RESOLV_CONF, buf_start, i); + if(resolv_conf_parse_line(&nslist[i], buf) ) { + crondlog(LVL5 "parsed file %s , line %s i=%d", filename, buf_start, i); i++; } else - crondlog(LVL5 "ERROR failed to parse from %s i=%d, line %s", RESOLV_CONF, i, buf_start); + crondlog(LVL5 "ERROR failed to parse from %s i=%d, line %s", filename, i, buf_start); } fclose (R); } diff --git a/eperd/readresolv.h b/eperd/readresolv.h index a71fd4a..2223a6d 100644 --- a/eperd/readresolv.h +++ b/eperd/readresolv.h @@ -2,6 +2,4 @@ * Copyright (c) 2013-2014 RIPE NCC * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. */ -void get_local_resolvers(char nslist[MAXNS][INET6_ADDRSTRLEN * 2], int *resolv_max); -void get_local_resolvers_nocache(char nslist[MAXNS][INET6_ADDRSTRLEN * 2], - int *resolv_max); +void get_local_resolvers(char *nslist[MAXNS], int *resolv_max, char *infname); diff --git a/eperd/traceroute.c b/eperd/traceroute.c index 441aebd..b335a9d 100644 --- a/eperd/traceroute.c +++ b/eperd/traceroute.c @@ -3977,7 +3977,7 @@ for (i= 0; argv[i] != NULL; i++) state->maxpacksize= maxpacksize; state->maxhops= maxhops; state->gaplimit= gaplimit; - state->interface= interface; + state->interface= interface ? strdup(interface) : NULL; state->destportstr= strdup(destportstr); state->duptimeout= duptimeout*1000; state->timeout= timeout*1000; @@ -4057,9 +4057,9 @@ static void traceroute_start2(void *state) trtstate= state; - if (trtstate->busy) + if (!trtstate->busy) { - printf("traceroute_start: busy, can't start\n"); + printf("traceroute_start: not busy, can't continue\n"); return; } trtstate->busy= 1; @@ -4180,6 +4180,8 @@ static int create_socket(struct trtstate *state, int do_tcp) if (bind_interface(state->socket_icmp, af, state->interface) == -1) { + crondlog(LVL7 "binding to interface '%s' failed with '%s'", state->interface, strerror(errno)); + snprintf(line, sizeof(line), ", " DBQ(error) ":" DBQ(bind_interface failed) " }"); add_str(state, line); @@ -4443,6 +4445,13 @@ static void traceroute_start(void *state) trtstate= state; + if (trtstate->busy) + { + printf("traceroute_start: busy, can't start\n"); + return; + } + trtstate->busy= 1; + if (trtstate->response_out) { trtstate->resp_file_out= fopen(trtstate->response_out, "w"); @@ -4493,6 +4502,8 @@ static int traceroute_delete(void *state) free(trtstate->atlas); trtstate->atlas= NULL; + free(trtstate->interface); + trtstate->interface= NULL; free(trtstate->bundle_id); trtstate->bundle_id= NULL; free(trtstate->hostname); -- cgit v1.2.3