aboutsummaryrefslogtreecommitdiffstats
path: root/lib/ns_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ns_parse.c')
-rw-r--r--lib/ns_parse.c139
1 files changed, 82 insertions, 57 deletions
diff --git a/lib/ns_parse.c b/lib/ns_parse.c
index 0462b67e..7f7a1bd2 100644
--- a/lib/ns_parse.c
+++ b/lib/ns_parse.c
@@ -38,7 +38,7 @@
/* Forward. */
-static void setsection(ns_msg *msg, ns_sect sect);
+static void setsection(ns_msg *msg, ns_sect sect);
/* Macros. */
@@ -46,135 +46,156 @@ static void setsection(ns_msg *msg, ns_sect sect);
#define RETERR(err) do { errno = (err); return (-1); } while (0)
#else
#define RETERR(err) \
- do { errno = (err); if (errno == errno) return (-1); } while (0)
+ do { errno = (err); if (errno == errno) { return (-1); } } while (0)
#endif
-#define PARSE_FMT_PRESO 0 /* Parse using presentation-format names */
-#define PARSE_FMT_WIRE 1 /* Parse using network-format names */
+#define PARSE_FMT_PRESO 0 /* Parse using presentation-format names */
+#define PARSE_FMT_WIRE 1 /* Parse using network-format names */
/* Public. */
/* These need to be in the same order as the nres.h:ns_flag enum. */
struct _ns_flagdata _ns_flagdata[16] = {
- { 0x8000, 15 }, /*%< qr. */
- { 0x7800, 11 }, /*%< opcode. */
- { 0x0400, 10 }, /*%< aa. */
- { 0x0200, 9 }, /*%< tc. */
- { 0x0100, 8 }, /*%< rd. */
- { 0x0080, 7 }, /*%< ra. */
- { 0x0040, 6 }, /*%< z. */
- { 0x0020, 5 }, /*%< ad. */
- { 0x0010, 4 }, /*%< cd. */
- { 0x000f, 0 }, /*%< rcode. */
- { 0x0000, 0 }, /*%< expansion (1/6). */
- { 0x0000, 0 }, /*%< expansion (2/6). */
- { 0x0000, 0 }, /*%< expansion (3/6). */
- { 0x0000, 0 }, /*%< expansion (4/6). */
- { 0x0000, 0 }, /*%< expansion (5/6). */
- { 0x0000, 0 }, /*%< expansion (6/6). */
+ { 0x8000, 15 }, /*%< qr. */
+ { 0x7800, 11 }, /*%< opcode. */
+ { 0x0400, 10 }, /*%< aa. */
+ { 0x0200, 9 }, /*%< tc. */
+ { 0x0100, 8 }, /*%< rd. */
+ { 0x0080, 7 }, /*%< ra. */
+ { 0x0040, 6 }, /*%< z. */
+ { 0x0020, 5 }, /*%< ad. */
+ { 0x0010, 4 }, /*%< cd. */
+ { 0x000f, 0 }, /*%< rcode. */
+ { 0x0000, 0 }, /*%< expansion (1/6). */
+ { 0x0000, 0 }, /*%< expansion (2/6). */
+ { 0x0000, 0 }, /*%< expansion (3/6). */
+ { 0x0000, 0 }, /*%< expansion (4/6). */
+ { 0x0000, 0 }, /*%< expansion (5/6). */
+ { 0x0000, 0 }, /*%< expansion (6/6). */
};
-int ns_msg_getflag(ns_msg handle, int flag) {
+int ns_msg_getflag(ns_msg handle, int flag)
+{
return(((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift);
}
int
-ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) {
+ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count)
+{
const u_char *optr = ptr;
- for ((void)NULL; count > 0; count--) {
+ for ((void) NULL; count > 0; count--) {
int b, rdlength;
b = dn_skipname(ptr, eom);
- if (b < 0)
+ if (b < 0) {
RETERR(EMSGSIZE);
- ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/;
+ }
+ ptr += b /*Name*/ + NS_INT16SZ /*Type*/ + NS_INT16SZ /*Class*/;
if (section != ns_s_qd) {
- if (ptr + NS_INT32SZ + NS_INT16SZ > eom)
+ if (ptr + NS_INT32SZ + NS_INT16SZ > eom) {
RETERR(EMSGSIZE);
- ptr += NS_INT32SZ/*TTL*/;
+ }
+ ptr += NS_INT32SZ /*TTL*/;
NS_GET16(rdlength, ptr);
- ptr += rdlength/*RData*/;
+ ptr += rdlength /*RData*/;
}
}
- if (ptr > eom)
+ if (ptr > eom) {
RETERR(EMSGSIZE);
+ }
return (ptr - optr);
}
int
-ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
+ns_initparse(const u_char *msg, int msglen, ns_msg *handle)
+{
const u_char *eom = msg + msglen;
int i;
handle->_msg = msg;
handle->_eom = eom;
- if (msg + NS_INT16SZ > eom)
+ if (msg + NS_INT16SZ > eom) {
RETERR(EMSGSIZE);
+ }
NS_GET16(handle->_id, msg);
- if (msg + NS_INT16SZ > eom)
+ if (msg + NS_INT16SZ > eom) {
RETERR(EMSGSIZE);
+ }
NS_GET16(handle->_flags, msg);
for (i = 0; i < ns_s_max; i++) {
- if (msg + NS_INT16SZ > eom)
+ if (msg + NS_INT16SZ > eom) {
RETERR(EMSGSIZE);
+ }
NS_GET16(handle->_counts[i], msg);
}
- for (i = 0; i < ns_s_max; i++)
- if (handle->_counts[i] == 0)
+ for (i = 0; i < ns_s_max; i++) {
+ if (handle->_counts[i] == 0) {
handle->_sections[i] = NULL;
- else {
- int b = ns_skiprr(msg, eom, (ns_sect)i,
- handle->_counts[i]);
+ } else {
+ int b = ns_skiprr(msg, eom, (ns_sect) i,
+ handle->_counts[i]);
- if (b < 0)
+ if (b < 0) {
return (-1);
+ }
handle->_sections[i] = msg;
msg += b;
}
- if (msg != eom)
+ }
+ if (msg != eom) {
RETERR(EMSGSIZE);
+ }
setsection(handle, ns_s_max);
return (0);
}
int
-ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
+ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr)
+{
int b;
int tmp;
/* Make section right. */
tmp = section;
- if (tmp < 0 || section >= ns_s_max)
+ if (tmp < 0 || section >= ns_s_max) {
RETERR(ENODEV);
- if (section != handle->_sect)
+ }
+ if (section != handle->_sect) {
setsection(handle, section);
+ }
/* Make rrnum right. */
- if (rrnum == -1)
+ if (rrnum == -1) {
rrnum = handle->_rrnum;
- if (rrnum < 0 || rrnum >= handle->_counts[(int)section])
+ }
+ if (rrnum < 0 || rrnum >= handle->_counts[(int) section]) {
RETERR(ENODEV);
- if (rrnum < handle->_rrnum)
+ }
+ if (rrnum < handle->_rrnum) {
setsection(handle, section);
+ }
if (rrnum > handle->_rrnum) {
b = ns_skiprr(handle->_msg_ptr, handle->_eom, section,
- rrnum - handle->_rrnum);
+ rrnum - handle->_rrnum);
- if (b < 0)
+ if (b < 0) {
return (-1);
+ }
handle->_msg_ptr += b;
handle->_rrnum = rrnum;
}
/* Do the parse. */
b = dn_expand(handle->_msg, handle->_eom,
- handle->_msg_ptr, rr->name, NS_MAXDNAME);
- if (b < 0)
+ handle->_msg_ptr, rr->name, NS_MAXDNAME);
+ if (b < 0) {
return (-1);
+ }
handle->_msg_ptr += b;
- if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom)
+ if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom) {
RETERR(EMSGSIZE);
+ }
NS_GET16(rr->type, handle->_msg_ptr);
NS_GET16(rr->rr_class, handle->_msg_ptr);
if (section == ns_s_qd) {
@@ -182,17 +203,20 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
rr->rdlength = 0;
rr->rdata = NULL;
} else {
- if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom)
+ if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom) {
RETERR(EMSGSIZE);
+ }
NS_GET32(rr->ttl, handle->_msg_ptr);
NS_GET16(rr->rdlength, handle->_msg_ptr);
- if (handle->_msg_ptr + rr->rdlength > handle->_eom)
+ if (handle->_msg_ptr + rr->rdlength > handle->_eom) {
RETERR(EMSGSIZE);
+ }
rr->rdata = handle->_msg_ptr;
handle->_msg_ptr += rr->rdlength;
}
- if (++handle->_rrnum > handle->_counts[(int)section])
- setsection(handle, (ns_sect)((int)section + 1));
+ if (++handle->_rrnum > handle->_counts[(int) section]) {
+ setsection(handle, (ns_sect) ((int) section + 1));
+ }
/* All done. */
return (0);
@@ -201,14 +225,15 @@ ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
/* Private. */
static void
-setsection(ns_msg *msg, ns_sect sect) {
+setsection(ns_msg *msg, ns_sect sect)
+{
msg->_sect = sect;
if (sect == ns_s_max) {
msg->_rrnum = -1;
msg->_msg_ptr = NULL;
} else {
msg->_rrnum = 0;
- msg->_msg_ptr = msg->_sections[(int)sect];
+ msg->_msg_ptr = msg->_sections[(int) sect];
}
}