From 5681caad554defb4264e219bc466f3b904afa722 Mon Sep 17 00:00:00 2001 From: frekky Date: Sun, 13 Mar 2016 14:00:06 +0800 Subject: [PATCH] Hold onto sockaddr length using new "socket" struct (less messy) TODO: use same socket struct for all sockety things --- src/client.c | 8 ++++---- src/client.h | 2 +- src/common.h | 5 +++++ src/iodine.c | 19 ++++++++++++------- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/client.c b/src/client.c index 3ced55f..9b5bbfd 100644 --- a/src/client.c +++ b/src/client.c @@ -68,7 +68,7 @@ static int running; static const char *password; /* Nameserver/domain info */ -static struct sockaddr_storage *nameserv_addrs; +static struct socket *nameserv_addrs; static int nameserv_addrs_len; static int current_nameserver; static struct sockaddr_storage raw_serv; @@ -207,7 +207,7 @@ client_get_conn() } void -client_set_nameservers(struct sockaddr_storage *addr, int addrslen) +client_set_nameservers(struct socket *addr, int addrslen) { nameserv_addrs = addr; nameserv_addrs_len = addrslen; @@ -552,8 +552,8 @@ send_query(int fd, uint8_t *hostname) DEBUG(4, " Sendquery: id %5d name[0] '%c'", q.id, hostname[0]); - sendto(fd, packet, len, 0, (struct sockaddr*) &nameserv_addrs[current_nameserver], - sizeof(struct sockaddr_storage)); + sendto(fd, packet, len, 0, (struct sockaddr*) &nameserv_addrs[current_nameserver].addr, + nameserv_addrs[current_nameserver].length); client_rotate_nameserver(); diff --git a/src/client.h b/src/client.h index 1ca646f..3078269 100644 --- a/src/client.h +++ b/src/client.h @@ -37,7 +37,7 @@ enum connection client_get_conn(); const char *client_get_raw_addr(); void client_rotate_nameserver(); -void client_set_nameservers(struct sockaddr_storage *, int); +void client_set_nameservers(struct socket *, int); void client_set_topdomain(const char *cp); void client_set_password(const char *cp); int client_set_qtype(char *qtype); diff --git a/src/common.h b/src/common.h index a8a19ad..9210b5e 100644 --- a/src/common.h +++ b/src/common.h @@ -121,6 +121,11 @@ struct query { struct timeval time_recv; }; +struct socket { + size_t length; + struct sockaddr_storage addr; +}; + enum connection { CONN_RAW_UDP = 0, CONN_DNS_NULL, diff --git a/src/iodine.c b/src/iodine.c index 6f57c8c..77745e8 100644 --- a/src/iodine.c +++ b/src/iodine.c @@ -181,7 +181,7 @@ main(int argc, char **argv) char **nameserv_hosts; int nameserv_hosts_len; struct sockaddr_storage nameservaddr; - struct sockaddr_storage *nameserv_addrs; + struct socket *nameserv_addrs; size_t nameserv_addrs_len; int nameservaddr_len; int nameserv_family; @@ -374,15 +374,18 @@ main(int argc, char **argv) // Preallocate memory with expected number of hosts nameserv_hosts = malloc(sizeof(char *) * nameserv_hosts_len); - nameserv_addrs = malloc(sizeof(struct sockaddr_storage) * nameserv_hosts_len); + nameserv_addrs = malloc(sizeof(struct socket) * nameserv_hosts_len); if (argc == 0) { usage(); /* NOT REACHED */ } else if (argc == 1) { nameserv_hosts[0] = get_resolvconf_addr(); - } else if (argc > 1) - for (int h = 0; h < nameserv_hosts_len; h++) nameserv_hosts[h] = strdup(argv[h + 1]); + } else if (argc > 1) { + for (int h = 0; h < nameserv_hosts_len; h++) { + nameserv_hosts[h] = strdup(argv[h + 1]); + } + } topdomain = strdup(argv[0]); for (int n = 0; n < nameserv_hosts_len; n++) { @@ -395,7 +398,8 @@ main(int argc, char **argv) errx(1, "Cannot lookup nameserver '%s': %s ", nameserv_host, gai_strerror(nameservaddr_len)); } - memcpy(&nameserv_addrs[n], &nameservaddr, sizeof(struct sockaddr_storage)); + nameserv_addrs[n].length = nameservaddr_len; + memcpy(&nameserv_addrs[n].addr, &nameservaddr, sizeof(struct sockaddr_storage)); nameserv_addrs_len ++; nameserv_host = NULL; } @@ -488,9 +492,10 @@ main(int argc, char **argv) signal(SIGTERM, sighandler); fprintf(stderr, "Sending DNS queries for %s to ", topdomain); - for (int a = 0; a < nameserv_addrs_len; a++) - fprintf(stderr, "%s%s", format_addr(&nameserv_addrs[a], nameservaddr_len), + for (int a = 0; a < nameserv_addrs_len; a++) { + fprintf(stderr, "%s%s", format_addr(&nameserv_addrs[a].addr, nameserv_addrs[a].length), (a != nameserv_addrs_len-1) ? ", " : ""); + } fprintf(stderr, "\n"); if (client_handshake(dns_fd, raw_mode, autodetect_frag_size, max_downstream_frag_size)) {