summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFederico Lucifredi <flucifredi@acm.org>2008-01-14 02:55:03 +0000
committerFederico Lucifredi <flucifredi@acm.org>2008-01-14 02:55:03 +0000
commit03ea73e25686fd6e0e9f5e4d74869c210f00d1e8 (patch)
tree55c541490b34ec68f59745b99ac604b33279ea70
parent3d9b36f75b4aae56ea7d0401057fcf71c9f76ee0 (diff)
adding record wide-area deletion on goodbye.
git-svn-id: file:///home/lennart/svn/public/avahi/branches/federico@1709 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
-rw-r--r--avahi-core/announce.c1
-rw-r--r--avahi-core/entry.c6
-rw-r--r--avahi-core/rr.h7
-rw-r--r--avahi-core/wide-area.c21
-rw-r--r--avahi-core/wide-area.h2
5 files changed, 23 insertions, 14 deletions
diff --git a/avahi-core/announce.c b/avahi-core/announce.c
index cc7cc31..0e920e8 100644
--- a/avahi-core/announce.c
+++ b/avahi-core/announce.c
@@ -521,6 +521,7 @@ void avahi_goodbye_entry(AvahiServer *s, AvahiEntry *e, int send_goodbye, int re
/* tracing message for wide-area pub development */
printf("--- record of type %d named %s observed at exitpoint\n", e->record->key->type, e->record->key->name);
+ avahi_wide_area_publish(r, "dynamic.endorfine.org", s->wide_area_lookup_engine->next_id++, s->wide_area_lookup_engine->fd_ipv4, AVAHI_WIDEAREA_DELETE);
}
if (remove)
diff --git a/avahi-core/entry.c b/avahi-core/entry.c
index 437f706..c73a3bf 100644
--- a/avahi-core/entry.c
+++ b/avahi-core/entry.c
@@ -233,7 +233,7 @@ static AvahiEntry * server_add_internal(
}*/
/* can generate a temporary random ID via rand() / (RAND_MAX / 65536) */
- /* call as wide_area_publish(<record/>,"dynamic.endorfine.org",<id/>, <socket/>) */
+ /* call as wide_area_publish(<record/>,"dynamic.endorfine.org",<id/>, <socket/>, <publish/delete flag/>) */
printf("---mark--- (1)\n");
if (s->wide_area_lookup_engine != NULL)
printf("---!NULL--- (1)\n");
@@ -241,9 +241,9 @@ static AvahiEntry * server_add_internal(
printf("---mark--- (1e)\n");
/* TODO: in merged version into upstream, zone needs to be an external configurable pulled from /etc */
- avahi_wide_area_publish(r, "dynamic.endorfine.org", s->wide_area_lookup_engine->next_id++, s->wide_area_lookup_engine->fd_ipv4);
+ avahi_wide_area_publish(r, "dynamic.endorfine.org", s->wide_area_lookup_engine->next_id++, s->wide_area_lookup_engine->fd_ipv4, AVAHI_WIDEAREA_PUBLISH);
- /* printf("next_id: \"%d\"\n",s->wide_area_lookup_engine->next_id ); */
+ /* printf("next_id: \"%d\"\n",s->wide_area_lookup_engine->next_id ); */
if (flags & AVAHI_PUBLISH_UPDATE) {
AvahiRecord *old_record;
diff --git a/avahi-core/rr.h b/avahi-core/rr.h
index 5dc3352..70b793d 100644
--- a/avahi-core/rr.h
+++ b/avahi-core/rr.h
@@ -51,6 +51,13 @@ enum {
AVAHI_TSIG_HMAC_SHA256 = 0x3
};
+/** wide-area publishing flags */
+
+enum {
+ AVAHI_WIDEAREA_PUBLISH = 0x1,
+ AVAHI_WIDEAREA_DELETE = 0x2
+};
+
/** DNS record classes, see RFC 1035, in addition to those defined in defs.h */
enum {
AVAHI_DNS_CLASS_ANY = 0xFF, /**< Special query type for requesting all records */
diff --git a/avahi-core/wide-area.c b/avahi-core/wide-area.c
index 40b3887..fc39763 100644
--- a/avahi-core/wide-area.c
+++ b/avahi-core/wide-area.c
@@ -820,8 +820,8 @@ AvahiRecord* avahi_tsig_sign_packet(const unsigned char* keyname, const unsigned
}
/* TODO: should this be located in this file? */
-/* call as wide_area_publish(<record/>,"dynamic.endorfine.org",<id/>, <socket/>) */
-int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd) {
+/* call as wide_area_publish(<record/>,"dynamic.endorfine.org",<id/>, <socket/>, <publish/delete>) */
+int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd, unsigned action) {
char result;
char globalname[AVAHI_DOMAIN_NAME_MAX]; /* size accounts for escapes if any */
@@ -875,7 +875,6 @@ int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int f
}
/* give record global DNS name under our domain */
- printf("record name: %s\n", r->key->name); /*tracing*/
if(r->key->name == (strstr(r->key->name, ".arpa") - strlen(r->key->name) + 5))
return(0); /* skip over ".arpa" records */
@@ -891,7 +890,7 @@ int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int f
if (r->key->type == AVAHI_DNS_TYPE_PTR || r->key->type == AVAHI_DNS_TYPE_CNAME || r->key->type == AVAHI_DNS_TYPE_NS || r->key->type == AVAHI_DNS_TYPE_SRV) {
- /* same transformation on r->data.ptr.name */
+ /* same transformation on r->data.ptr.name and r->data.srv.name */
switch (r->key->type) { /* share same layout in union */
case AVAHI_DNS_TYPE_PTR:
@@ -922,12 +921,14 @@ int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int f
avahi_log_error("invalid record, not .local nor .arpa in extension.");
}
- printf("global name: %s\n", globalname); /*tracing*/
-
- if(r->key->type == AVAHI_DNS_TYPE_A) { /* standardize TTLs independent of record for wide-area */
- result = avahi_dns_packet_append_record(p, r, 0, 1); /* bind max TTL to 1 sec */
- } else {
- result = avahi_dns_packet_append_record(p, r, 0, 3); /* bind max TTL to 3 secs */
+ if(action == AVAHI_WIDEAREA_DELETE) { /* deleting pre-existing record */
+ result = avahi_dns_packet_append_record(p, r, 0, 0); /* bind max TTL to 0, deletion */
+ } else { /* publishing new record */
+ if(r->key->type == AVAHI_DNS_TYPE_A) { /* standardize TTLs independent of record for wide-area */
+ result = avahi_dns_packet_append_record(p, r, 0, 1); /* bind max TTL to 1 sec */
+ } else {
+ result = avahi_dns_packet_append_record(p, r, 0, 3); /* bind max TTL to 3 secs */
+ }
}
avahi_dns_packet_set_field(p, AVAHI_DNS_FIELD_UPCOUNT, 1); /*increment record count for UPCOUNT */
diff --git a/avahi-core/wide-area.h b/avahi-core/wide-area.h
index 3396743..8311868 100644
--- a/avahi-core/wide-area.h
+++ b/avahi-core/wide-area.h
@@ -107,7 +107,7 @@ void avahi_wide_area_cleanup(AvahiWideAreaLookupEngine *e);
int avahi_wide_area_has_servers(AvahiWideAreaLookupEngine *e);
AvahiRecord* avahi_tsig_sign_packet(const unsigned char* keyname, const unsigned char* key, unsigned keylength, AvahiDnsPacket *p, unsigned algorithm, uint16_t id);
-int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd);
+int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd, unsigned action);
AvahiWideAreaLookup *avahi_wide_area_lookup_new(AvahiWideAreaLookupEngine *e, AvahiKey *key, AvahiWideAreaLookupCallback callback, void *userdata);
void avahi_wide_area_lookup_free(AvahiWideAreaLookup *q);