#include "timeval.h"
#include "sockaddr.h"
+char *probe_err;
+
/* Convert the destination address from text to sockaddr */
int decode_address_string(
int ip_version,
{
if (decode_address_string
(param->ip_version, param->remote_address, dest_sockaddr)) {
+ probe_err = "decode address string remote";
return -1;
}
if (param->local_address) {
if (decode_address_string
(param->ip_version, param->local_address, src_sockaddr)) {
+ probe_err = "decode address string local";
return -1;
}
} else {
+ probe_err = "find source address";
if (find_source_addr(src_sockaddr, dest_sockaddr)) {
+ //probe_err = "find source address";
return -1;
}
+ probe_err = "";
}
/* DGRAM ICMP id is taken from src_port not from ICMP header */
if (param->protocol == IPPROTO_ICMP) {
sock = socket(destaddr->ss_family, SOCK_DGRAM, IPPROTO_UDP);
if (sock == -1) {
+ probe_err = "open socket";
return -1;
}
if (connect(sock, (struct sockaddr *) &dest_with_port, len) == 0) {
if (getsockname(sock, (struct sockaddr *) srcaddr, &len)) {
close(sock);
+ probe_err = "getsockname";
return -1;
}
} else {
* a case when mtr is run against unreachable host (that can become
* reachable) */
if (errno != EHOSTUNREACH) {
+ probe_err = "not hostunreach";
close(sock);
return -1;
}
}
#else
close(sock);
+ probe_err = "connect failed";
return -1;
#endif
}
if (resolve_probe_addresses(net_state, ¶m, &p0.remote_addr,
&p0.local_addr)) {
- fprintf(stderr, "Error decoding localhost address\n");
+ fprintf(stderr, "Error decoding localhost address (%s/%s)\n",
+ probe_err, strerror (errno));
exit(EXIT_FAILURE);
}
{
int i;
- memset(ctl->fld_index, -1, FLD_INDEX_SZ);
+ memset(ctl->fld_index, -1, FLD_INDEX_SZ*sizeof(ctl->fld_index[0]));
for (i = 0; data_fields[i].key != 0; i++) {
ctl->available_options[i] = data_fields[i].key;