aboutsummaryrefslogtreecommitdiff
path: root/eperd
diff options
context:
space:
mode:
Diffstat (limited to 'eperd')
-rw-r--r--eperd/eooqd.c82
-rw-r--r--eperd/eperd.c60
-rw-r--r--eperd/evtdig.c53
-rw-r--r--eperd/evtraceroute.c1
-rw-r--r--eperd/ntp.c12
-rw-r--r--eperd/readresolv.c116
-rw-r--r--eperd/readresolv.h4
-rw-r--r--eperd/traceroute.c17
8 files changed, 215 insertions, 130 deletions
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; i<MAXNS; i++)
+ {
+ if (qry->nslist[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; i<MAXNS; i++)
+ {
+ if (qry->nslist[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 <syslog.h>
#include <event2/event.h>
#include <event2/event_struct.h>
+#include <event2/dns.h>
#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 <math.h>
-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 <atlas@ripe.net>
* 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);