From 16e9df41641d508834001964f04950da3e4dbf7e Mon Sep 17 00:00:00 2001 From: Bjorn Andersson Date: Sat, 10 Feb 2007 22:30:40 +0000 Subject: [PATCH] moved method that encoded strings to dnsnames to read.c and renamed it to putname --- src/dns.c | 45 ++++----------------------------------------- src/dns.h | 1 - src/read.c | 36 ++++++++++++++++++++++++++++++++++++ src/read.h | 1 + 4 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/dns.c b/src/dns.c index 10f3c93..0b3e028 100644 --- a/src/dns.c +++ b/src/dns.c @@ -60,7 +60,9 @@ dns_encode(char *buf, size_t buflen, struct query *q, qr_t qr, char *data, size_ header->qdcount = htons(1); name = 0xc000 | ((p - buf) & 0x3fff); - p += dns_encode_hostname(q->name, p, strlen(q->name)); + + putname(&p, 256, q->name); + putshort(&p, q->type); putshort(&p, C_IN); @@ -69,11 +71,6 @@ dns_encode(char *buf, size_t buflen, struct query *q, qr_t qr, char *data, size_ putshort(&p, C_IN); putlong(&p, 0); - /* - * XXX: This is jidder! This is used to detect if there's packets to be sent. - */ - q->id = 0; - putshort(&p, datalen); putdata(&p, data, datalen); break; @@ -81,7 +78,7 @@ dns_encode(char *buf, size_t buflen, struct query *q, qr_t qr, char *data, size_ header->qdcount = htons(1); header->arcount = htons(1); - p += dns_encode_hostname(data, p, datalen); + putname(&p, 256, data); putshort(&p, q->type); putshort(&p, C_IN); @@ -215,37 +212,3 @@ dns_build_hostname(char *buf, size_t buflen, return written; } -int -dns_encode_hostname(const char *host, char *buffer, int size) -{ - char *h; - char *p; - char *word; - int left; - - h = strdup(host); - memset(buffer, 0, size); - p = buffer; - left = size; - - word = strtok(h, "."); - while(word) { - if (strlen(word) > 63 || strlen(word) > left) { - free(h); - return -1; - } - left -= (strlen(word) + 1); - *p++ = (char)strlen(word); - memcpy(p, word, strlen(word)); - p += strlen(word); - - word = strtok(NULL, "."); - } - - *p++ = 0; - - free(h); - - return p - buffer; -} - diff --git a/src/dns.h b/src/dns.h index 3df38e8..1ab30f0 100644 --- a/src/dns.h +++ b/src/dns.h @@ -25,7 +25,6 @@ typedef enum { } qr_t; int dns_build_hostname(char *, size_t, const char *, const size_t, const char *); -int dns_encode_hostname(const char *, char *, int); int dns_encode(char *, size_t, struct query *, qr_t, char *, size_t); int dns_decode(char *, size_t, struct query *, qr_t, char *, size_t); diff --git a/src/read.c b/src/read.c index aac3862..f6c37c3 100644 --- a/src/read.c +++ b/src/read.c @@ -16,6 +16,7 @@ #include #include +#include static int readname_loop(char *packet, int packetlen, char **src, char *dst, size_t length, size_t loop) @@ -124,6 +125,41 @@ readdata(char *packet, char **src, char *dst, size_t len) return len; } +int +putname(char **buf, size_t buflen, const char *host) +{ + char *word; + int left; + char *h; + char *p; + + h = strdup(host); + left = buflen; + p = *buf; + + word = strtok(h, "."); + while(word) { + if (strlen(word) > 63 || strlen(word) > left) { + free(h); + return -1; + } + + left -= (strlen(word) + 1); + *p++ = (char)strlen(word); + memcpy(p, word, strlen(word)); + p += strlen(word); + + word = strtok(NULL, "."); + } + + *p++ = 0; + + free(h); + + *buf = p; + return buflen - left; +} + int putbyte(char **dst, char value) { diff --git a/src/read.h b/src/read.h index d695a7e..3c24e10 100644 --- a/src/read.h +++ b/src/read.h @@ -22,6 +22,7 @@ int readshort(char *, char **, short *); int readlong(char *, char **, uint32_t *); int readdata(char *, char **, char *, size_t); +int putname(char **, size_t, const char *); int putbyte(char **, char); int putshort(char **, short); int putlong(char **, uint32_t);