11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* $NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */ 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1996,1999 by Internet Software Consortium. 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Permission to use, copy, modify, and distribute this software for any 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * purpose with or without fee is hereby granted, provided that the above 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * copyright notice and this permission notice appear in all copies. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef lint 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef notdef 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic const char rcsid[] = "Id: ns_parse.c,v 1.3.2.1.4.1 2004/03/09 08:33:44 marka Exp"; 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__RCSID("$NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $"); 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Import. */ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <netinet/in.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "arpa_nameser.h" 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef ANDROID_CHANGES 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include "resolv_private.h" 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <resolv.h> 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Forward. */ 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void setsection(ns_msg *msg, ns_sect sect); 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Macros. */ 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define RETERR(err) do { errno = (err); return (-1); } while (/*NOTREACHED*//*CONSTCOND*/0) 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Public. */ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* These need to be in the same order as the nres.h:ns_flag enum. */ 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectconst struct _ns_flagdata _ns_flagdata[16] = { 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x8000, 15 }, /* qr. */ 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x7800, 11 }, /* opcode. */ 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0400, 10 }, /* aa. */ 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0200, 9 }, /* tc. */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0100, 8 }, /* rd. */ 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0080, 7 }, /* ra. */ 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0040, 6 }, /* z. */ 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0020, 5 }, /* ad. */ 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0010, 4 }, /* cd. */ 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x000f, 0 }, /* rcode. */ 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (1/6). */ 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (2/6). */ 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (3/6). */ 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (4/6). */ 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (5/6). */ 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project { 0x0000, 0 }, /* expansion (6/6). */ 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project}; 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint ns_msg_getflag(ns_msg handle, int flag) { 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return((u_int32_t)((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift); 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) { 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *optr = ptr; 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (; count > 0; count--) { 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int b, rdlength; 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project b = dn_skipname(ptr, eom); 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (b < 0) 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/; 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section != ns_s_qd) { 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ptr + NS_INT32SZ + NS_INT16SZ > eom) 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ptr += NS_INT32SZ/*TTL*/; 931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(rdlength, ptr); 941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project ptr += rdlength/*RData*/; 951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (ptr > eom) 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (ptr - optr); 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_initparse(const u_char *msg, int msglen, ns_msg *handle) { 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const u_char *eom = msg + msglen; 1051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int i; 1061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memset(handle, 0x5e, sizeof *handle); 1081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_msg = msg; 1091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_eom = eom; 1101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (msg + NS_INT16SZ > eom) 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(handle->_id, msg); 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (msg + NS_INT16SZ > eom) 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(handle->_flags, msg); 1161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < ns_s_max; i++) { 1171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (msg + NS_INT16SZ > eom) 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(handle->_counts[i], msg); 1201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project for (i = 0; i < ns_s_max; i++) 1221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (handle->_counts[i] == 0) 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_sections[i] = NULL; 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project else { 1251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int b = ns_skiprr(msg, eom, (ns_sect)i, 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_counts[i]); 1271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (b < 0) 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_sections[i] = msg; 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg += b; 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (msg != eom) 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project setsection(handle, ns_s_max); 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 1401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) { 1411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int b; 1421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Make section right. */ 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if ((unsigned)section >= (unsigned)ns_s_max) 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(ENODEV); 1461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section != handle->_sect) 1471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project setsection(handle, section); 1481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Make rrnum right. */ 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum == -1) 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum = handle->_rrnum; 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum < 0 || rrnum >= handle->_counts[(int)section]) 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(ENODEV); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum < handle->_rrnum) 1551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project setsection(handle, section); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (rrnum > handle->_rrnum) { 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project b = ns_skiprr(handle->_msg_ptr, handle->_eom, section, 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rrnum - handle->_rrnum); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (b < 0) 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_msg_ptr += b; 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_rrnum = rrnum; 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Do the parse. */ 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project b = dn_expand(handle->_msg, handle->_eom, 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_msg_ptr, rr->name, NS_MAXDNAME); 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (b < 0) 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (-1); 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_msg_ptr += b; 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom) 1731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(rr->type, handle->_msg_ptr); 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(rr->rr_class, handle->_msg_ptr); 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (section == ns_s_qd) { 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rr->ttl = 0; 1781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rr->rdlength = 0; 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rr->rdata = NULL; 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom) 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET32(rr->ttl, handle->_msg_ptr); 1841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project NS_GET16(rr->rdlength, handle->_msg_ptr); 1851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (handle->_msg_ptr + rr->rdlength > handle->_eom) 1861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project RETERR(EMSGSIZE); 1871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project rr->rdata = handle->_msg_ptr; 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project handle->_msg_ptr += rr->rdlength; 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (++handle->_rrnum > handle->_counts[(int)section]) 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project setsection(handle, (ns_sect)((int)section + 1)); 1921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* All done. */ 1941dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return (0); 1951dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 1961dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Private. */ 1981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectstatic void 2001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectsetsection(ns_msg *msg, ns_sect sect) { 2011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg->_sect = sect; 2021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (sect == ns_s_max) { 2031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg->_rrnum = -1; 2041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg->_msg_ptr = NULL; 2051dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } else { 2061dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg->_rrnum = 0; 2071dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project msg->_msg_ptr = msg->_sections[(int)sect]; 2081dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 2091dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 210