summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2005-08-22 23:11:22 +0000
committerLennart Poettering <lennart@poettering.net>2005-08-22 23:11:22 +0000
commited06b3a0319dca75edb73310a35b525c7456a035 (patch)
treee89cfdfa5e2a63c1749a1e605223a7b91c215429
parentd2dd8d0d225fd8e4cfc67c8125a38ed22f17ddd3 (diff)
Make protocol an attribute instead of an element. (Sorry Lathiat, but you broke the DTD, and I just fixed this without forcing a specific order of elements.)
git-svn-id: file:///home/lennart/svn/public/avahi/trunk@401 941a03a8-eaeb-0310-b9a0-b1bbd8fe43fe
-rw-r--r--avahi-daemon/avahi-service.dtd4
-rw-r--r--avahi-daemon/example.service3
-rw-r--r--avahi-daemon/static-services.c62
-rw-r--r--man/avahi.service.5.xml.in21
4 files changed, 40 insertions, 50 deletions
diff --git a/avahi-daemon/avahi-service.dtd b/avahi-daemon/avahi-service.dtd
index c8477f1..8ac1ca6 100644
--- a/avahi-daemon/avahi-service.dtd
+++ b/avahi-daemon/avahi-service.dtd
@@ -5,7 +5,7 @@
<!ELEMENT name (#PCDATA)>
<!ATTLIST name replace-wildcards (yes|no) "no">
<!ELEMENT service (type,domain-name?,host-name?,port,txt-record*)>
-<!ATTLIST service>
+<!ATTLIST service protocol (ipv4|ipv6|any) "any">
<!ELEMENT type (#PCDATA)>
<!ATTLIST type>
<!ELEMENT domain-name (#PCDATA)>
@@ -14,7 +14,5 @@
<!ATTLIST host-name>
<!ELEMENT port (#PCDATA)>
<!ATTLIST port>
-<!ELEMENT protocol (#PCDATA)>
-<!ATTLIST protocol>
<!ELEMENT txt-record (#PCDATA)>
<!ATTLIST txt-record>
diff --git a/avahi-daemon/example.service b/avahi-daemon/example.service
index 72ab8ea..0e565b9 100644
--- a/avahi-daemon/example.service
+++ b/avahi-daemon/example.service
@@ -16,12 +16,11 @@
<port>631</port>
</service>
- <service>
+ <service protocol="ipv6">
<type>_uberprinter._tcp</type>
<domain-name>local</domain-name>
<host-name>quux.local</host-name>
<port>4711</port>
- <protocol>any</protocol>
<txt-record>this=is</txt-record>
<txt-record>a=really</txt-record>
<txt-record>bad=example</txt-record>
diff --git a/avahi-daemon/static-services.c b/avahi-daemon/static-services.c
index e402a98..09d7b1b 100644
--- a/avahi-daemon/static-services.c
+++ b/avahi-daemon/static-services.c
@@ -251,7 +251,6 @@ typedef enum {
XML_TAG_DOMAIN_NAME,
XML_TAG_HOST_NAME,
XML_TAG_PORT,
- XML_TAG_PROTOCOL,
XML_TAG_TXT_RECORD
} xml_tag_name;
@@ -285,19 +284,41 @@ static void XMLCALL xml_start(void *data, const char *el, const char *attr[]) {
u->group->replace_wildcards = strcmp(attr[1], "yes") == 0;
else
goto invalid_attr;
- }
- if (attr[2])
- goto invalid_attr;
+ if (attr[2])
+ goto invalid_attr;
+ }
} else if (u->current_tag == XML_TAG_SERVICE_GROUP && strcmp(el, "service") == 0) {
- if (attr[0])
- goto invalid_attr;
+ u->current_tag = XML_TAG_SERVICE;
assert(!u->service);
u->service = static_service_new(u->group);
- u->current_tag = XML_TAG_SERVICE;
+ if (attr[0]) {
+ if (strcmp(attr[0], "protocol") == 0) {
+ AvahiProtocol protocol;
+
+ if (strcmp(attr[1], "ipv4") == 0) {
+ protocol = AVAHI_PROTO_INET;
+ } else if (strcmp(attr[1], "ipv6") == 0) {
+ protocol = AVAHI_PROTO_INET6;
+ } else if (strcmp(attr[1], "any") == 0) {
+ protocol = AVAHI_PROTO_UNSPEC;
+ } else {
+ avahi_log_error("%s: parse failure: invalid protocol specification \"%s\".", u->group->filename, attr[1]);
+ u->failed = 1;
+ return;
+ }
+
+ u->service->protocol = protocol;
+ } else
+ goto invalid_attr;
+
+ if (attr[2])
+ goto invalid_attr;
+ }
+
} else if (u->current_tag == XML_TAG_SERVICE && strcmp(el, "type") == 0) {
if (attr[0])
goto invalid_attr;
@@ -318,11 +339,6 @@ static void XMLCALL xml_start(void *data, const char *el, const char *attr[]) {
goto invalid_attr;
u->current_tag = XML_TAG_PORT;
- } else if (u->current_tag == XML_TAG_SERVICE && strcmp(el, "protocol") == 0) {
- if (attr[0])
- goto invalid_attr;
-
- u->current_tag = XML_TAG_PROTOCOL;
} else if (u->current_tag == XML_TAG_SERVICE && strcmp(el, "txt-record") == 0) {
if (attr[0])
goto invalid_attr;
@@ -394,27 +410,6 @@ static void XMLCALL xml_end(void *data, const char *el) {
break;
}
- case XML_TAG_PROTOCOL: {
- int protocol;
- assert(u->service);
-
- if (u->buf && strcasecmp (u->buf, "ipv4") == 0) {
- protocol = AVAHI_PROTO_INET;
- } else if (u->buf && strcasecmp (u->buf, "ipv6") == 0) {
- protocol = AVAHI_PROTO_INET6;
- } else if (u->buf && strcasecmp (u->buf, "any") == 0) {
- protocol = AVAHI_PROTO_UNSPEC;
- } else {
- avahi_log_error("%s: parse failure: invalid protocol specification \"%s\".", u->group->filename, u->buf);
- u->failed = 1;
- return;
- }
-
- u->service->protocol = protocol;
- u->current_tag = XML_TAG_SERVICE;
- break;
- }
-
case XML_TAG_TXT_RECORD: {
assert(u->service);
@@ -484,7 +479,6 @@ static void XMLCALL xml_cdata(void *data, const XML_Char *s, int len) {
break;
case XML_TAG_PORT:
- case XML_TAG_PROTOCOL:
case XML_TAG_TXT_RECORD:
assert(u->service);
u->buf = append_cdata(u->buf, s, len);
diff --git a/man/avahi.service.5.xml.in b/man/avahi.service.5.xml.in
index 5260ef2..7580d63 100644
--- a/man/avahi.service.5.xml.in
+++ b/man/avahi.service.5.xml.in
@@ -45,7 +45,7 @@
</option>
<option>
- <p><opt>&lt;name replace-wildcards="yes|no"/&gt;</opt> The
+ <p><opt>&lt;name replace-wildcards="yes|no"&gt;</opt> The
service name. If <opt>replace-wildcards</opt> is "yes", any
occurence of the string "%h" will be replaced by the local
host name. This can be used for service names like "Remote
@@ -54,16 +54,19 @@
</option>
<option>
- <p><opt>&lt;service&gt;</opt> Contains the service information
- for exactly one service type. Should contain one
- <opt>&lt;type&gt;</opt> and one <opt>&lt;port&gt;</opt>
- element. Optionally it may contain one
+ <p><opt>&lt;service protocol="ipv4|ipv6|any"&gt;</opt>
+ Contains the service information for exactly one service
+ type. Should contain one <opt>&lt;type&gt;</opt> and one
+ <opt>&lt;port&gt;</opt> element. Optionally it may contain one
<opt>&lt;domain-name&gt;</opt>, one
<opt>&lt;host-name&gt;</opt> and multiple
- <opt>&lt;txt-record&gt;</opt> elements.</p>
+ <opt>&lt;txt-record&gt;</opt> elements. The attribute
+ <opt>protocol</opt> specifies the protocol to
+ advertise the service on. If <opt>any</opt> is used (which is
+ the default), the service will be advertised on both IPv4 and
+ IPv6.</p>
</option>
-
<option>
<p><opt>&lt;type&gt;</opt> Contains the DNS-SD service type for this service. e.g. "_http._tcp".</p>
</option>
@@ -88,10 +91,6 @@
</option>
<option>
- <p><opt>&lt;protocol&gt;</opt> The protocol to advertise the service on, can be any of <opt>ipv4</opt>, <opt>ipv6</opt> or <opt>any</opt>.</p>
- </option>
-
- <option>
<p><opt>&lt;txt-record&gt;</opt> DNS-SD TXT record data.</p>
</option>