Hold onto sockaddr length using new "socket" struct (less messy)

TODO: use same socket struct for all sockety things
This commit is contained in:
frekky 2016-03-13 14:00:06 +08:00
parent 1035840335
commit 5681caad55
4 changed files with 22 additions and 12 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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,

View File

@ -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)) {