]>
git.saurik.com Git - apple/libresolv.git/blob - res_mkquery.c
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
37 * Permission to use, copy, modify, and distribute this software for any
38 * purpose with or without fee is hereby granted, provided that the above
39 * copyright notice and this permission notice appear in all copies, and that
40 * the name of Digital Equipment Corporation not be used in advertising or
41 * publicity pertaining to distribution of the document or software without
42 * specific, written prior permission.
44 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
45 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
46 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
47 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
48 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
49 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
50 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
55 * Portions Copyright (c) 1996-1999 by Internet Software Consortium.
57 * Permission to use, copy, modify, and distribute this software for any
58 * purpose with or without fee is hereby granted, provided that the above
59 * copyright notice and this permission notice appear in all copies.
61 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
62 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
63 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
64 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
65 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
66 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
67 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
71 #if defined(LIBC_SCCS) && !defined(lint)
72 static const char sccsid
[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
73 static const char rcsid
[] = "$Id: res_mkquery.c,v 1.1 2006/03/01 19:01:38 majka Exp $";
74 #endif /* LIBC_SCCS and not lint */
77 #include "port_before.h"
79 #include <sys/types.h>
80 #include <sys/param.h>
81 #include <netinet/in.h>
82 #include <arpa/nameser.h>
87 #include "res_private.h"
89 #include "port_after.h"
92 /* Options. Leave them on. */
95 extern const char *__res_opcodes
[];
98 * Form all types of queries.
99 * Returns the size of the result or -1.
102 res_nmkquery(res_state statp
,
103 int op
, /* opcode of query */
104 const char *dname
, /* domain name */
105 int class, int type
, /* class and type of query */
106 const u_char
*data
, /* resource record data */
107 int datalen
, /* length of data */
108 const u_char
*newrr_in
, /* new rr for modify or append */
109 u_char
*buf
, /* buffer to put query */
110 int buflen
) /* size of buffer */
115 u_char
*dnptrs
[20], **dpp
, **lastdnptr
;
118 n
= (int)newrr_in
; n
= 0;
124 if (statp
->options
& RES_DEBUG
)
125 printf(";; res_nmkquery(%s, %s, %s, %s)\n",
126 __res_opcodes
[op
], dname
, p_class(class), p_type(type
));
129 * Initialize header fields.
131 if ((buf
== NULL
) || (buflen
< NS_HFIXEDSZ
))
133 memset(buf
, 0, NS_HFIXEDSZ
);
136 hp
->id
= res_randomid();
138 hp
->id
= htons(++statp
->id
);
141 hp
->rd
= (statp
->options
& RES_RECURSE
) != 0;
142 hp
->rcode
= ns_r_noerror
;
143 cp
= buf
+ NS_HFIXEDSZ
;
144 buflen
-= NS_HFIXEDSZ
;
148 lastdnptr
= dnptrs
+ sizeof dnptrs
/ sizeof dnptrs
[0];
150 * perform opcode specific processing
153 case ns_o_query
: /*FALLTHROUGH*/
155 if ((buflen
-= NS_QFIXEDSZ
) < 0)
157 if ((n
= dn_comp(dname
, cp
, buflen
, dnptrs
, lastdnptr
)) < 0)
165 hp
->qdcount
= htons(1);
166 if (op
== ns_o_query
|| data
== NULL
)
169 * Make an additional record for completion domain.
171 buflen
-= NS_RRFIXEDSZ
;
172 n
= dn_comp((const char *)data
, cp
, buflen
, dnptrs
, lastdnptr
);
177 putshort(ns_t_null
, cp
);
185 hp
->arcount
= htons(1);
190 * Initialize answer section
192 if (buflen
< 1 + NS_RRFIXEDSZ
+ datalen
)
194 *cp
++ = '\0'; /* no domain name */
201 putshort(datalen
, cp
);
204 memcpy(cp
, data
, datalen
);
207 hp
->ancount
= htons(1);
217 /* attach OPT pseudo-RR, as documented in RFC2671 (EDNS0). */
223 res_nopt(statp
, n0
, buf
, buflen
, anslen
)
226 u_char
*buf
; /* buffer to put query */
227 int buflen
; /* size of buffer */
228 int anslen
; /* answer buffer length */
235 if ((statp
->options
& RES_DEBUG
) != 0)
236 printf(";; res_nopt()\n");
243 if (buflen
< 1 + NS_RRFIXEDSZ
)
249 putshort(T_OPT
, cp
); /* TYPE */
251 putshort(anslen
& 0xffff, cp
); /* CLASS = UDP payload size */
253 *cp
++ = ns_r_noerror
; /* extended RCODE */
254 *cp
++ = 0; /* EDNS version */
255 if (statp
->options
& RES_USE_DNSSEC
) {
257 if (statp
->options
& RES_DEBUG
)
258 printf(";; res_opt()... ENDS0 DNSSEC\n");
260 flags
|= NS_OPT_DNSSEC_OK
;
264 putshort(0, cp
); /* RDLEN */
266 hp
->arcount
= htons(ntohs(hp
->arcount
) + 1);
267 buflen
-= NS_RRFIXEDSZ
;