summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFederico Lucifredi <flucifredi@acm.org>2008-01-14 02:34:15 +0000
committerFederico Lucifredi <flucifredi@acm.org>2008-01-14 02:34:15 +0000
commit3d9b36f75b4aae56ea7d0401057fcf71c9f76ee0 (patch)
treee749fa90cc4f4d8e3a52ba2dc9b1c496ac47b42b
parentb60a876be239a6280b76e5ebc2755727f8bf3275 (diff)
fixing .local and .[domain] estensions.
git-svn-id: file:///home/lennart/svn/public/avahi/branches/federico@1708 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
-rw-r--r--avahi-core/wide-area.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/avahi-core/wide-area.c b/avahi-core/wide-area.c
index 0e42a15..40b3887 100644
--- a/avahi-core/wide-area.c
+++ b/avahi-core/wide-area.c
@@ -824,8 +824,11 @@ AvahiRecord* avahi_tsig_sign_packet(const unsigned char* keyname, const unsigned
int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int fd) {
char result;
- char *backup;
char globalname[AVAHI_DOMAIN_NAME_MAX]; /* size accounts for escapes if any */
+ char globalfield[AVAHI_DOMAIN_NAME_MAX];
+ char *backup = NULL;
+ char *backupfield = NULL;
+ char *tmp;
AvahiDnsPacket *p;
AvahiKey *k;
@@ -874,12 +877,52 @@ 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(strstr(r->key->name, ".arpa") == (r->key->name + strlen(r->key->name - 5)){
- printf("arpa?: %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 */
+
+ if(r->key->name == (strstr(r->key->name, ".local") - strlen(r->key->name) + 6)) {
+ strcpy(globalname, r->key->name);
+ tmp = strstr(globalname, ".local");
+ tmp[1] = 0; /* delete extension from copy */
+ strcat(globalname, zone);
+
+ backup = r->key->name; /* back up key, restore it at exit */
+ r->key->name = globalname; /* fix key for wide-pub*/
+
+ 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 */
+
+ switch (r->key->type) { /* share same layout in union */
+ case AVAHI_DNS_TYPE_PTR:
+ case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
+ strcpy(globalfield, r->data.ptr.name);
+ tmp = strstr(globalfield, ".local");
+ tmp[1] = 0; /* delete extension from copy */
+ strcat(globalfield, zone);
+
+ backupfield = r->data.ptr.name; /* back up field, restore it at exit */
+ r->data.ptr.name = globalfield; /* fix field for wide-pub*/
+ break;
+
+ case AVAHI_DNS_TYPE_SRV:
+ strcpy(globalfield, r->data.srv.name);
+ tmp = strstr(globalfield, ".local");
+ tmp[1] = 0; /* delete extension from copy */
+ strcat(globalfield, zone);
+
+ backupfield = r->data.srv.name; /* back up field, restore it at exit */
+ r->data.srv.name = globalfield; /* fix field for wide-pub*/
+ break;
+ }
+ }
+
+ } else {
+ avahi_log_error("invalid record, not .local nor .arpa in extension.");
}
- strcpy(globalname, r->key->name);
+ 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 */
@@ -926,5 +969,14 @@ int avahi_wide_area_publish(AvahiRecord *r, const char *zone, uint16_t id, int f
/* avahi_send_dns_packet_ipv4(<socket/>, <interface/>, <packet/>, <srcaddr/>, <dstaddr/>, <dstport/>);*/
avahi_send_dns_packet_ipv4(fd, AVAHI_IF_UNSPEC, p, NULL, &a.data.ipv4, AVAHI_DNS_PORT);
+ /* cleanup */
+ r->key->name = backup; /* restore original key */
+ if (backupfield)
+ if (r->key->type == AVAHI_DNS_TYPE_SRV) { /* SRV has a different layout than other records in the union */
+ r->data.srv.name = backupfield; /* restore field if altered */
+ } else {
+ r->data.ptr.name = backupfield; /* restore field if altered */
+ }
+
return 0;
}