#include "cache.h"
#include "service.h"
#include "announce.h"
+#include "interface.h"
static struct uloop_timeout reconnect;
char *iface_name = "eth0";
-const char *iface_ip;
static int
-parse_answer(struct uloop_fd *u, uint8_t *buffer, int len, uint8_t **b, int *rlen, int cache)
+parse_answer(struct interface *iface, uint8_t *buffer, int len, uint8_t **b, int *rlen, int cache)
{
char *name = dns_consume_name(buffer, len, b, rlen);
struct dns_answer *a;
*b += a->rdlength;
if (cache)
- cache_answer(u, buffer, len, name, a, rdata);
+ cache_answer(iface, buffer, len, name, a, rdata);
return 0;
}
static void
-parse_question(struct uloop_fd *u, char *name, struct dns_question *q)
+parse_question(struct interface *iface, char *name, struct dns_question *q)
{
char *host;
case TYPE_ANY:
host = service_name("local");
if (!strcmp(name, host))
- service_reply(u, NULL);
+ service_reply(iface, NULL);
break;
case TYPE_PTR:
- service_announce_services(u, name);
- service_reply(u, name);
+ service_announce_services(iface, name);
+ service_reply(iface, name);
break;
case TYPE_AAAA:
if (host)
*host = '\0';
if (!strcmp(hostname, name))
- service_reply_a(u, q->type);
+ service_reply_a(iface, q->type);
break;
};
}
static void
read_socket(struct uloop_fd *u, unsigned int events)
{
- uint8_t buffer[8 * 1024];
+ struct interface *iface = container_of(u, struct interface, fd);
+ static uint8_t buffer[8 * 1024];
uint8_t *b = buffer;
struct dns_header *h;
int len, rlen;
}
if (!(h->flags & FLAG_RESPONSE))
- parse_question(announce_fd, name, q);
+ parse_question(iface, name, q);
}
if (!(h->flags & FLAG_RESPONSE))
return;
while (h->answers-- > 0)
- parse_answer(u, buffer, len, &b, &rlen, 1);
+ parse_answer(iface, buffer, len, &b, &rlen, 1);
while (h->authority-- > 0)
- parse_answer(u, buffer, len, &b, &rlen, 0);
+ parse_answer(iface, buffer, len, &b, &rlen, 0);
while (h->additional-- > 0)
- parse_answer(u, buffer, len, &b, &rlen, 1);
+ parse_answer(iface, buffer, len, &b, &rlen, 1);
}
static void
reconnect_socket(struct uloop_timeout *timeout)
{
-
- if (iface_ip)
- listener.fd = usock(USOCK_UDP | USOCK_SERVER | USOCK_NONBLOCK, MCAST_ADDR, "5353");
-
- if (!iface_ip || listener.fd < 0) {
+ cur_iface->fd.fd = usock(USOCK_UDP | USOCK_SERVER | USOCK_NONBLOCK, MCAST_ADDR, "5353");
+ if (cur_iface->fd.fd < 0) {
fprintf(stderr, "failed to add listener: %s\n", strerror(errno));
uloop_timeout_set(&reconnect, 1000);
} else {
- if (socket_setup(listener.fd, iface_ip)) {
+ if (interface_socket_setup(cur_iface)) {
uloop_timeout_set(&reconnect, 1000);
- listener.fd = -1;
+ cur_iface->fd.fd = -1;
return;
}
- uloop_fd_add(&listener, ULOOP_READ);
+ uloop_fd_add(&cur_iface->fd, ULOOP_READ);
sleep(5);
- dns_send_question(&listener, "_services._dns-sd._tcp.local", TYPE_PTR);
- dns_send_question(&listener, "_services._dns-sd._udp.local", TYPE_PTR);
- announce_init(&listener);
+ dns_send_question(cur_iface, "_services._dns-sd._udp.local", TYPE_PTR);
+ announce_init(cur_iface);
}
}
if (!iface_name)
return -1;
- iface_ip = get_iface_ipv4(iface_name);
+ uloop_init();
- if (!iface_ip) {
- fprintf(stderr, "failed to read ip for %s\n", iface_name);
+ if (interface_add(iface_name)) {
+ fprintf(stderr, "Failed to add interface %s\n", iface_name);
return -1;
}
- fprintf(stderr, "interface %s has ip %s\n", iface_name, iface_ip);
- signal_setup();
- if (dns_init())
+ if (!cur_iface)
return -1;
+ signal_setup();
+
if (cache_init())
return -1;
service_init();
- listener.cb = read_socket;
+ cur_iface->fd.cb = read_socket;
reconnect.cb = reconnect_socket;
- uloop_init();
uloop_timeout_set(&reconnect, 100);
ubus_startup();
uloop_run();
uloop_done();
- dns_cleanup();
cache_cleanup();
service_cleanup();