]> git.meshlink.io Git - catta/blobdiff - avahi-core/dns.c
* Some minor cleanups in netlink code
[catta] / avahi-core / dns.c
index 9bc7aec4b615d3aa10832e4aead759437b7d45c0..a9ccda5e246676ef978a720fd0a01a0c0bf7685e 100644 (file)
@@ -165,7 +165,6 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) {
         const char *pname;
         char label[64], *u;
         
-
         /* Check whether we can compress this name. */
 
         if (p->name_table && (prev = avahi_hashmap_lookup(p->name_table, name))) {
@@ -177,11 +176,12 @@ uint8_t* avahi_dns_packet_append_name(AvahiDnsPacket *p, const char *name) {
             assert(idx < p->size);
 
             if (idx < 0x4000) {
-                uint16_t *t;
-                if (!(t = (uint16_t*) avahi_dns_packet_extend(p, sizeof(uint16_t))))
+                uint8_t *t;
+                if (!(t = (uint8_t*) avahi_dns_packet_extend(p, sizeof(uint16_t))))
                     return NULL;
 
-                *t = htons((0xC000 | idx));
+               t[0] = (uint8_t) ((0xC000 | idx) >> 8);
+               t[1] = (uint8_t) idx;
                 return saved_ptr;
             }
         }
@@ -223,7 +223,8 @@ uint8_t* avahi_dns_packet_append_uint16(AvahiDnsPacket *p, uint16_t v) {
     if (!(d = avahi_dns_packet_extend(p, sizeof(uint16_t))))
         return NULL;
     
-    *((uint16_t*) d) = htons(v);
+    d[0] = (uint8_t) (v >> 8);
+    d[1] = (uint8_t) v;
     return d;
 }
 
@@ -234,7 +235,10 @@ uint8_t *avahi_dns_packet_append_uint32(AvahiDnsPacket *p, uint32_t v) {
     if (!(d = avahi_dns_packet_extend(p, sizeof(uint32_t))))
         return NULL;
     
-    *((uint32_t*) d) = htonl(v);
+    d[0] = (uint8_t) (v >> 24);
+    d[1] = (uint8_t) (v >> 16);
+    d[2] = (uint8_t) (v >> 8);
+    d[3] = (uint8_t) v;
 
     return d;
 }
@@ -286,21 +290,37 @@ uint8_t *avahi_dns_packet_extend(AvahiDnsPacket *p, size_t l) {
     return d;
 }
 
-int avahi_dns_packet_is_valid(AvahiDnsPacket *p) {
+int avahi_dns_packet_check_valid(AvahiDnsPacket *p) {
     uint16_t flags;
     assert(p);
 
-    if (p->size < 12)
+    if (p->size < AVAHI_DNS_PACKET_HEADER_SIZE)
         return -1;
 
     flags = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS);
+    
+    if (flags & AVAHI_DNS_FLAG_OPCODE)
+        return -1;
+
+    return 0;
+}
 
-    if (flags & AVAHI_DNS_FLAG_OPCODE || flags & AVAHI_DNS_FLAG_RCODE)
+int avahi_dns_packet_check_valid_multicast(AvahiDnsPacket *p) {
+    uint16_t flags;
+    assert(p);
+
+    if (avahi_dns_packet_check_valid(p) < 0)
+        return -1;
+    
+    flags = avahi_dns_packet_get_field(p, AVAHI_DNS_FIELD_FLAGS);
+    
+    if (flags & AVAHI_DNS_FLAG_RCODE)
         return -1;
 
     return 0;
 }
 
+
 int avahi_dns_packet_is_query(AvahiDnsPacket *p) {
     assert(p);
     
@@ -350,7 +370,7 @@ static int consume_labels(AvahiDnsPacket *p, unsigned idx, char *ret_name, size_
             } else
                 first_label = 0;
 
-            if (!(avahi_escape_label(AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l)))
+            if (!(avahi_escape_label((char*) AVAHI_DNS_PACKET_DATA(p) + idx, n, &ret_name, &l)))
                 return -1;
 
             idx += n;
@@ -385,26 +405,32 @@ int avahi_dns_packet_consume_name(AvahiDnsPacket *p, char *ret_name, size_t l) {
 }
 
 int avahi_dns_packet_consume_uint16(AvahiDnsPacket *p, uint16_t *ret_v) {
+    uint8_t *d;
+
     assert(p);
     assert(ret_v);
 
     if (p->rindex + sizeof(uint16_t) > p->size)
         return -1;
 
-    *ret_v = ntohs(*((uint16_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex)));
+    d = (uint8_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex);
+    *ret_v = (d[0] << 8) | d[1];
     p->rindex += sizeof(uint16_t);
 
     return 0;
 }
 
 int avahi_dns_packet_consume_uint32(AvahiDnsPacket *p, uint32_t *ret_v) {
+    uint8_t* d;
+
     assert(p);
     assert(ret_v);
 
     if (p->rindex + sizeof(uint32_t) > p->size)
         return -1;
 
-    *ret_v = ntohl(*((uint32_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex)));
+    d = (uint8_t*) (AVAHI_DNS_PACKET_DATA(p) + p->rindex);
+    *ret_v = (d[0] << 24) | (d[1] << 16) | (d[2] << 8) | d[3];
     p->rindex += sizeof(uint32_t);
     
     return 0;
@@ -478,7 +504,6 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f
     const void* start;
 
     assert(p);
-    assert(ret_cache_flush);
 
 /*     avahi_log_debug("consume_record()"); */
 
@@ -492,7 +517,8 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f
 
 /*     avahi_log_debug("name = %s, rdlength = %u", name, rdlength); */
 
-    *ret_cache_flush = !!(class & AVAHI_DNS_CACHE_FLUSH);
+    if (ret_cache_flush)
+        *ret_cache_flush = !!(class & AVAHI_DNS_CACHE_FLUSH);
     class &= ~AVAHI_DNS_CACHE_FLUSH;
     
     start = avahi_dns_packet_get_rptr(p);
@@ -503,6 +529,7 @@ AvahiRecord* avahi_dns_packet_consume_record(AvahiDnsPacket *p, int *ret_cache_f
     switch (type) {
         case AVAHI_DNS_TYPE_PTR:
         case AVAHI_DNS_TYPE_CNAME:
+        case AVAHI_DNS_TYPE_NS:
 
 /*             avahi_log_debug("ptr"); */
             
@@ -608,16 +635,17 @@ AvahiKey* avahi_dns_packet_consume_key(AvahiDnsPacket *p, int *ret_unicast_respo
     uint16_t type, class;
 
     assert(p);
-    assert(ret_unicast_response);
 
     if (avahi_dns_packet_consume_name(p, name, sizeof(name)) < 0 ||
         avahi_dns_packet_consume_uint16(p, &type) < 0 ||
         avahi_dns_packet_consume_uint16(p, &class) < 0)
         return NULL;
 
-    *ret_unicast_response = !!(class & AVAHI_DNS_UNICAST_RESPONSE);
-    class &= ~AVAHI_DNS_UNICAST_RESPONSE;
+    if (ret_unicast_response)
+        *ret_unicast_response = !!(class & AVAHI_DNS_UNICAST_RESPONSE);
 
+    class &= ~AVAHI_DNS_UNICAST_RESPONSE;
+    
     return avahi_key_new(name, class, type);
 }
 
@@ -661,8 +689,9 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c
     switch (r->key->type) {
         
         case AVAHI_DNS_TYPE_PTR:
-        case AVAHI_DNS_TYPE_CNAME :
-
+        case AVAHI_DNS_TYPE_CNAME:
+        case AVAHI_DNS_TYPE_NS:
+            
             if (!(avahi_dns_packet_append_name(p, r->data.ptr.name)))
                 goto fail;
             
@@ -733,7 +762,8 @@ uint8_t* avahi_dns_packet_append_record(AvahiDnsPacket *p, AvahiRecord *r, int c
 
 /*     avahi_log_debug("appended %u", size); */
 
-    * (uint16_t*) l = htons((uint16_t) size);
+    l[0] = (uint8_t) ((uint16_t) size >> 8);
+    l[1] = (uint8_t) ((uint16_t) size);
     
     return t;