1 /* 2 * Copyright (c) 1985, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Portions copyright (c) 1999, 2000 6 * Intel Corporation. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * 3. All advertising materials mentioning features or use of this software 21 * must display the following acknowledgement: 22 * 23 * This product includes software developed by the University of 24 * California, Berkeley, Intel Corporation, and its contributors. 25 * 26 * 4. Neither the name of University, Intel Corporation, or their respective 27 * contributors may be used to endorse or promote products derived from 28 * this software without specific prior written permission. 29 * 30 * THIS SOFTWARE IS PROVIDED BY THE REGENTS, INTEL CORPORATION AND 31 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, 32 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 33 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS, 34 * INTEL CORPORATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 35 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 37 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 38 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 39 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 40 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 41 * 42 */ 43 44 /* 45 * Portions Copyright (c) 1993 by Digital Equipment Corporation. 46 * 47 * Permission to use, copy, modify, and distribute this software for any 48 * purpose with or without fee is hereby granted, provided that the above 49 * copyright notice and this permission notice appear in all copies, and that 50 * the name of Digital Equipment Corporation not be used in advertising or 51 * publicity pertaining to distribution of the document or software without 52 * specific, written prior permission. 53 * 54 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL 55 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES 56 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT 57 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 58 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 59 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 60 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 61 * SOFTWARE. 62 */ 63 64 /* 65 * Portions Copyright (c) 1996 by Internet Software Consortium. 66 * 67 * Permission to use, copy, modify, and distribute this software for any 68 * purpose with or without fee is hereby granted, provided that the above 69 * copyright notice and this permission notice appear in all copies. 70 * 71 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 72 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 73 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 74 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 75 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 76 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 77 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 78 * SOFTWARE. 79 */ 80 81 #if defined(LIBC_SCCS) && !defined(lint) 82 static char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93"; 83 static char orig_rcsid[] = "From: Id: res_mkquery.c,v 8.9 1997/04/24 22:22:36 vixie Exp $"; 84 static char rcsid[] = "$Id: res_mkquery.c,v 1.1.1.1 2003/11/19 01:51:37 kyu3 Exp $"; 85 #endif /* LIBC_SCCS and not lint */ 86 87 #include <sys/types.h> 88 #include <sys/param.h> 89 #include <netinet/in.h> 90 #include <arpa/nameser.h> 91 #include <netdb.h> 92 #include <resolv.h> 93 #include <stdio.h> 94 #include <string.h> 95 96 #include "res_config.h" 97 98 /* 99 * Form all types of queries. 100 * Returns the size of the result or -1. 101 */ 102 int 103 res_mkquery( 104 int op, /* opcode of query */ 105 const char *dname, /* domain name */ 106 int class, /* class of query */ 107 int type, /* type of query */ 108 const u_char *data, /* resource record data */ 109 int datalen, /* length of data */ 110 const u_char *newrr_in, /* new rr for modify or append */ 111 u_char *buf, /* buffer to put query */ 112 int buflen /* size of buffer */ 113 ) 114 { 115 register HEADER *hp; 116 register u_char *cp; 117 register int n; 118 u_char *dnptrs[20], **dpp, **lastdnptr; 119 120 if ((_res.options & RES_INIT) == 0 && res_init() == -1) { 121 h_errno = NETDB_INTERNAL; 122 return (-1); 123 } 124 #ifdef DEBUG 125 if (_res.options & RES_DEBUG) 126 printf(";; res_mkquery(%d, %s, %d, %d)\n", 127 op, dname, class, type); 128 #endif 129 /* 130 * Initialize header fields. 131 */ 132 if ((buf == NULL) || (buflen < HFIXEDSZ)) 133 return (-1); 134 memset(buf, 0, HFIXEDSZ); 135 hp = (HEADER *) buf; 136 hp->id = htons(++_res.id); 137 hp->opcode = op; 138 hp->rd = (_res.options & RES_RECURSE) != 0; 139 hp->rcode = NOERROR; 140 cp = buf + HFIXEDSZ; 141 buflen -= HFIXEDSZ; 142 dpp = dnptrs; 143 *dpp++ = buf; 144 *dpp++ = NULL; 145 lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0]; 146 /* 147 * perform opcode specific processing 148 */ 149 switch (op) { 150 case QUERY: /*FALLTHROUGH*/ 151 case NS_NOTIFY_OP: 152 if ((buflen -= QFIXEDSZ) < 0) 153 return (-1); 154 if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) 155 return (-1); 156 cp += n; 157 buflen -= n; 158 __putshort((u_int16_t)type, cp); 159 cp += INT16SZ; 160 __putshort((u_int16_t)class, cp); 161 cp += INT16SZ; 162 hp->qdcount = htons(1); 163 if (op == QUERY || data == NULL) 164 break; 165 /* 166 * Make an additional record for completion domain. 167 */ 168 buflen -= RRFIXEDSZ; 169 n = dn_comp((char *)data, cp, buflen, dnptrs, lastdnptr); 170 if (n < 0) 171 return (-1); 172 cp += n; 173 buflen -= n; 174 __putshort(T_NULL, cp); 175 cp += INT16SZ; 176 __putshort((u_int16_t)class, cp); 177 cp += INT16SZ; 178 __putlong(0, cp); 179 cp += INT32SZ; 180 __putshort(0, cp); 181 cp += INT16SZ; 182 hp->arcount = htons(1); 183 break; 184 185 case IQUERY: 186 /* 187 * Initialize answer section 188 */ 189 if (buflen < 1 + RRFIXEDSZ + datalen) 190 return (-1); 191 *cp++ = '\0'; /* no domain name */ 192 __putshort((u_int16_t)type, cp); 193 cp += INT16SZ; 194 __putshort((u_int16_t)class, cp); 195 cp += INT16SZ; 196 __putlong(0, cp); 197 cp += INT32SZ; 198 __putshort((u_int16_t)datalen, cp); 199 cp += INT16SZ; 200 if (datalen) { 201 memcpy(cp, data, datalen); 202 cp += datalen; 203 } 204 hp->ancount = htons(1); 205 break; 206 207 default: 208 return (-1); 209 } 210 return ((int)(cp - buf)); 211 } 212