for (e = s->entries; e; e = e->entry_next)
if (flx_key_pattern_match(k, e->record->key))
- if (flx_interface_match(i, e->interface, e->protocol))
- flx_interface_post_response(i, a, e->record, FALSE);
+ if (flx_interface_match(i, e->interface, e->protocol) && flx_entry_established(s, e, i))
+ flx_interface_post_response(i, a, e->record, e->flags & FLX_SERVER_ENTRY_UNIQUE, FALSE);
} else {
/* Handle all other queries */
for (e = g_hash_table_lookup(s->rrset_by_key, k); e; e = e->by_key_next)
- if (flx_interface_match(i, e->interface, e->protocol))
- flx_interface_post_response(i, a, e->record, FALSE);
+ if (flx_interface_match(i, e->interface, e->protocol) && flx_entry_established(s, e, i))
+ flx_interface_post_response(i, a, e->record, e->flags & FLX_SERVER_ENTRY_UNIQUE, FALSE);
}
}
g_assert(i);
g_assert(a);
- for (n = flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT); n > 0; n --) {
+ for (n = flx_dns_packet_get_field(p, FLX_DNS_FIELD_QDCOUNT); n > 0; n --) {
flxKey *key;
if (!(key = flx_dns_packet_consume_key(p))) {
}
/* Known Answer Suppresion */
- for (n = flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT); n > 0; n --) {
+ for (n = flx_dns_packet_get_field(p, FLX_DNS_FIELD_ANCOUNT); n > 0; n --) {
flxRecord *record;
gboolean unique = FALSE;
g_assert(i);
g_assert(a);
- for (n = flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT) +
- flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT); n > 0; n--) {
+ for (n = flx_dns_packet_get_field(p, FLX_DNS_FIELD_ANCOUNT) +
+ flx_dns_packet_get_field(p, FLX_DNS_FIELD_ARCOUNT); n > 0; n--) {
flxRecord *record;
gboolean cache_flush = FALSE;
gchar *txt;
if (flx_dns_packet_is_query(p)) {
- if (flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT) == 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_ARCOUNT) != 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_NSCOUNT) != 0) {
+ if (flx_dns_packet_get_field(p, FLX_DNS_FIELD_QDCOUNT) == 0 ||
+ flx_dns_packet_get_field(p, FLX_DNS_FIELD_ARCOUNT) != 0) {
g_warning("Invalid query packet.");
return;
}
handle_query(s, p, i, &a);
g_message("Handled query");
} else {
- if (flx_dns_packet_get_field(p, DNS_FIELD_QDCOUNT) != 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_ANCOUNT) == 0 ||
- flx_dns_packet_get_field(p, DNS_FIELD_NSCOUNT) != 0) {
+ if (flx_dns_packet_get_field(p, FLX_DNS_FIELD_QDCOUNT) != 0 ||
+ flx_dns_packet_get_field(p, FLX_DNS_FIELD_ANCOUNT) == 0 ||
+ flx_dns_packet_get_field(p, FLX_DNS_FIELD_NSCOUNT) != 0) {
g_warning("Invalid response packet.");
return;
}
uname(&utsname);
r->data.hinfo.cpu = g_strdup(g_strup(utsname.machine));
r->data.hinfo.os = g_strdup(g_strup(utsname.sysname));
- flx_server_add(s, 0, 0, AF_UNSPEC, TRUE, r);
+ flx_server_add(s, 0, 0, AF_UNSPEC, FLX_SERVER_ENTRY_UNIQUE, r);
flx_record_unref(r);
/* Add localhost entries */
flx_address_parse("127.0.0.1", AF_INET, &a);
- flx_server_add_address(s, 0, 0, AF_UNSPEC, TRUE, "localhost", &a);
+ flx_server_add_address(s, 0, 0, AF_UNSPEC, FLX_SERVER_ENTRY_UNIQUE|FLX_SERVER_ENTRY_NOPROBE|FLX_SERVER_ENTRY_NOANNOUNCE, "localhost", &a);
flx_address_parse("::1", AF_INET6, &a);
- flx_server_add_address(s, 0, 0, AF_UNSPEC, TRUE, "ip6-localhost", &a);
+ flx_server_add_address(s, 0, 0, AF_UNSPEC, FLX_SERVER_ENTRY_UNIQUE|FLX_SERVER_ENTRY_NOPROBE|FLX_SERVER_ENTRY_NOANNOUNCE, "ip6-localhost", &a);
}
flxServer *flx_server_new(GMainContext *c) {
gint id,
gint interface,
guchar protocol,
- gboolean unique,
+ flxServerEntryFlags flags,
flxRecord *r) {
flxServerEntry *e, *t;
e->id = id;
e->interface = interface;
e->protocol = protocol;
- e->unique = unique;
+ e->flags = flags;
FLX_LLIST_HEAD_INIT(flxAnnouncement, e->announcements);
gint id,
gint interface,
guchar protocol,
- gboolean unique,
+ flxServerEntryFlags flags,
const gchar *name,
const gchar *dest) {
r = flx_record_new_full(name ? name : s->hostname, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_PTR);
r->data.ptr.name = flx_normalize_name(dest);
- flx_server_add(s, id, interface, protocol, unique, r);
+ flx_server_add(s, id, interface, protocol, flags, r);
flx_record_unref(r);
}
gint id,
gint interface,
guchar protocol,
- gboolean unique,
+ flxServerEntryFlags flags,
const gchar *name,
flxAddress *a) {
r = flx_record_new_full(name, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_A);
r->data.a.address = a->data.ipv4;
- flx_server_add(s, id, interface, protocol, unique, r);
+ flx_server_add(s, id, interface, protocol, flags, r);
flx_record_unref(r);
reverse = flx_reverse_lookup_name_ipv4(&a->data.ipv4);
g_assert(reverse);
- flx_server_add_ptr(s, id, interface, protocol, unique, reverse, name);
+ flx_server_add_ptr(s, id, interface, protocol, flags, reverse, name);
g_free(reverse);
} else {
r = flx_record_new_full(name, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_AAAA);
r->data.aaaa.address = a->data.ipv6;
- flx_server_add(s, id, interface, protocol, unique, r);
+ flx_server_add(s, id, interface, protocol, flags, r);
flx_record_unref(r);
reverse = flx_reverse_lookup_name_ipv6_arpa(&a->data.ipv6);
g_assert(reverse);
- flx_server_add_ptr(s, id, interface, protocol, unique, reverse, name);
+ flx_server_add_ptr(s, id, interface, protocol, flags, reverse, name);
g_free(reverse);
reverse = flx_reverse_lookup_name_ipv6_int(&a->data.ipv6);
g_assert(reverse);
- flx_server_add_ptr(s, id, interface, protocol, unique, reverse, name);
+ flx_server_add_ptr(s, id, interface, protocol, flags, reverse, name);
g_free(reverse);
}
gint id,
gint interface,
guchar protocol,
- gboolean unique,
+ flxServerEntryFlags flags,
const gchar *name,
va_list va) {
r = flx_record_new_full(name ? name : s->hostname, FLX_DNS_CLASS_IN, FLX_DNS_TYPE_TXT);
r->data.txt.string_list = flx_string_list_new_va(va);
- flx_server_add(s, id, interface, protocol, unique, r);
+ flx_server_add(s, id, interface, protocol, flags, r);
flx_record_unref(r);
}
gint id,
gint interface,
guchar protocol,
- gboolean unique,
+ flxServerEntryFlags flags,
const gchar *name,
...) {
g_assert(s);
va_start(va, name);
- flx_server_add_text_va(s, id, interface, protocol, unique, name, va);
+ flx_server_add_text_va(s, id, interface, protocol, flags, name, va);
va_end(va);
}
flx_interface_monitor_walk(s->monitor, interface, protocol, post_query_callback, key);
}
+struct tmpdata {
+ flxRecord *record;
+ gboolean flush_cache;
+};
+
static void post_response_callback(flxInterfaceMonitor *m, flxInterface *i, gpointer userdata) {
- flxRecord *r = userdata;
+ struct tmpdata *tmpdata = userdata;
g_assert(m);
g_assert(i);
- g_assert(r);
+ g_assert(tmpdata);
- flx_interface_post_response(i, NULL, r, FALSE);
+ flx_interface_post_response(i, NULL, tmpdata->record, tmpdata->flush_cache, FALSE);
}
-void flx_server_post_response(flxServer *s, gint interface, guchar protocol, flxRecord *record) {
+void flx_server_post_response(flxServer *s, gint interface, guchar protocol, flxRecord *record, gboolean flush_cache) {
+ struct tmpdata tmpdata;
+
g_assert(s);
g_assert(record);
- flx_interface_monitor_walk(s->monitor, interface, protocol, post_response_callback, record);
+ tmpdata.record = record;
+ tmpdata.flush_cache = flush_cache;
+
+ flx_interface_monitor_walk(s->monitor, interface, protocol, post_response_callback, &tmpdata);
}