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))) {
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;
}
}
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;
}
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;
}
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);
} 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;
}
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;
const void* start;
assert(p);
- assert(ret_cache_flush);
/* avahi_log_debug("consume_record()"); */
/* 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);
switch (type) {
case AVAHI_DNS_TYPE_PTR:
case AVAHI_DNS_TYPE_CNAME:
+ case AVAHI_DNS_TYPE_NS:
/* avahi_log_debug("ptr"); */
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);
}
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;
/* 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;