From 03ea73e25686fd6e0e9f5e4d74869c210f00d1e8 Mon Sep 17 00:00:00 2001 From: Federico Lucifredi Date: Mon, 14 Jan 2008 02:55:03 +0000 Subject: adding record wide-area deletion on goodbye. git-svn-id: file:///home/lennart/svn/public/avahi/branches/federico@1709 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe --- avahi-core/announce.c | 1 + avahi-core/entry.c | 6 +++--- avahi-core/rr.h | 7 +++++++ avahi-core/wide-area.c | 21 +++++++++++---------- avahi-core/wide-area.h | 2 +- 5 files changed, 23 insertions(+), 14 deletions(-) (limited to 'avahi-core') 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(,"dynamic.endorfine.org",, ) */ + /* call as wide_area_publish(,"dynamic.endorfine.org",, , ) */ 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(,"dynamic.endorfine.org",, ) */ -int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd) { +/* call as wide_area_publish(,"dynamic.endorfine.org",, , ) */ +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); -- cgit