res_mkquery.c (7257d1b4) | res_mkquery.c (bd0e95e6) |
---|---|
1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 6 unchanged lines hidden (view full) --- 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* | 1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE --- 6 unchanged lines hidden (view full) --- 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* |
23 * Copyright 2015 Gary Mills |
|
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28/* All Rights Reserved */ 29 30/* 31 * University Copyright- Copyright (c) 1982, 1986, 1988 32 * The Regents of the University of California 33 * All Rights Reserved 34 * 35 * University Acknowledgment- Portions of this document are derived from 36 * software developed by the University of California, Berkeley, and its 37 * contributors. 38 */ 39 | 24 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 25 * Use is subject to license terms. 26 */ 27 28/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 29/* All Rights Reserved */ 30 31/* 32 * University Copyright- Copyright (c) 1982, 1986, 1988 33 * The Regents of the University of California 34 * All Rights Reserved 35 * 36 * University Acknowledgment- Portions of this document are derived from 37 * software developed by the University of California, Berkeley, and its 38 * contributors. 39 */ 40 |
40#pragma ident "%Z%%M% %I% %E% SMI" 41 | |
42#include <stdio.h> 43#include <sys/types.h> 44#include <sys/socket.h> 45#include <sys/stat.h> 46#include <netinet/in.h> 47#include <arpa/nameser.h> 48#include <resolv.h> | 41#include <stdio.h> 42#include <sys/types.h> 43#include <sys/socket.h> 44#include <sys/stat.h> 45#include <netinet/in.h> 46#include <arpa/nameser.h> 47#include <resolv.h> |
48#include <string.h> 49#include <stdlib.h> 50#include <unistd.h> |
|
49#include <errno.h> 50#include <netdb.h> | 51#include <errno.h> 52#include <netdb.h> |
53#include "crossl.h" |
|
51 52/* 53 * Kludge to time out quickly if there is no /etc/resolv.conf 54 * and a TCP connection to the local DNS server fails. 55 * 56 * Moved function from res_send.c to res_mkquery.c. This 57 * solves a long timeout problem with nslookup. 58 * --- 33 unchanged lines hidden (view full) --- 92 * nameserver. If this fails, then we know that 93 * DNS is misconfigured and we can quickly exit. 94 */ 95 ns = socket(AF_INET, SOCK_STREAM, 0); 96 IN_SET_LOOPBACK_ADDR(&ns_sin); 97 ns_sin.sin_port = htons(NAMESERVER_PORT); 98 if (connect(ns, (struct sockaddr *) &ns_sin, 99 sizeof ns_sin) == -1) { | 54 55/* 56 * Kludge to time out quickly if there is no /etc/resolv.conf 57 * and a TCP connection to the local DNS server fails. 58 * 59 * Moved function from res_send.c to res_mkquery.c. This 60 * solves a long timeout problem with nslookup. 61 * --- 33 unchanged lines hidden (view full) --- 95 * nameserver. If this fails, then we know that 96 * DNS is misconfigured and we can quickly exit. 97 */ 98 ns = socket(AF_INET, SOCK_STREAM, 0); 99 IN_SET_LOOPBACK_ADDR(&ns_sin); 100 ns_sin.sin_port = htons(NAMESERVER_PORT); 101 if (connect(ns, (struct sockaddr *) &ns_sin, 102 sizeof ns_sin) == -1) { |
100 close(ns); | 103 (void) close(ns); |
101 return(-1); 102 } 103 else { | 104 return(-1); 105 } 106 else { |
104 close(ns); | 107 (void) close(ns); |
105 return(0); 106 } 107 } 108 109 return(0); 110 } 111 112 return (0); --- 10 unchanged lines hidden (view full) --- 123 int class, type; /* class and type of query */ 124 char *data; /* resource record data */ 125 int datalen; /* length of data */ 126 struct rrec *newrr; /* new rr for modify or append */ 127 char *buf; /* buffer to put query */ 128 int buflen; /* size of buffer */ 129{ 130 register HEADER *hp; | 108 return(0); 109 } 110 } 111 112 return(0); 113 } 114 115 return (0); --- 10 unchanged lines hidden (view full) --- 126 int class, type; /* class and type of query */ 127 char *data; /* resource record data */ 128 int datalen; /* length of data */ 129 struct rrec *newrr; /* new rr for modify or append */ 130 char *buf; /* buffer to put query */ 131 int buflen; /* size of buffer */ 132{ 133 register HEADER *hp; |
131 register char *cp; | 134 register u_char *cp; |
132 register int n; | 135 register int n; |
133 char *dnptrs[10], **dpp, **lastdnptr; | 136 u_char *dnptrs[10], **dpp, **lastdnptr; |
134 135#ifdef DEBUG 136 if (_res.options & RES_DEBUG) 137 printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type); 138#endif /* DEBUG */ 139 140 /* 141 * Check to see if we can bailout quickly. --- 12 unchanged lines hidden (view full) --- 154 } 155 156 /* 157 * Initialize header fields. 158 */ 159 if ((buf == NULL) || (buflen < sizeof (HEADER))) 160 return (-1); 161#ifdef SYSV | 137 138#ifdef DEBUG 139 if (_res.options & RES_DEBUG) 140 printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type); 141#endif /* DEBUG */ 142 143 /* 144 * Check to see if we can bailout quickly. --- 12 unchanged lines hidden (view full) --- 157 } 158 159 /* 160 * Initialize header fields. 161 */ 162 if ((buf == NULL) || (buflen < sizeof (HEADER))) 163 return (-1); 164#ifdef SYSV |
162 memset(buf, 0, sizeof (HEADER)); | 165 (void) memset(buf, 0, sizeof (HEADER)); |
163#else 164 bzero(buf, sizeof (HEADER)); 165#endif 166 hp = (HEADER *) buf; 167 hp->id = htons(++_res.id); 168 hp->opcode = op; 169 hp->pr = (_res.options & RES_PRIMARY) != 0; 170 hp->rd = (_res.options & RES_RECURSE) != 0; 171 hp->rcode = NOERROR; | 166#else 167 bzero(buf, sizeof (HEADER)); 168#endif 169 hp = (HEADER *) buf; 170 hp->id = htons(++_res.id); 171 hp->opcode = op; 172 hp->pr = (_res.options & RES_PRIMARY) != 0; 173 hp->rd = (_res.options & RES_RECURSE) != 0; 174 hp->rcode = NOERROR; |
172 cp = buf + sizeof (HEADER); | 175 cp = (u_char *)(buf + sizeof (HEADER)); |
173 buflen -= sizeof (HEADER); 174 dpp = dnptrs; | 176 buflen -= sizeof (HEADER); 177 dpp = dnptrs; |
175 *dpp++ = buf; | 178 *dpp++ = (u_char *)buf; |
176 *dpp++ = NULL; 177 lastdnptr = dnptrs + sizeof (dnptrs) / sizeof (dnptrs[0]); 178 /* 179 * perform opcode specific processing 180 */ 181 switch (op) { 182 case QUERY: 183 if ((buflen -= QFIXEDSZ) < 0) 184 return (-1); | 179 *dpp++ = NULL; 180 lastdnptr = dnptrs + sizeof (dnptrs) / sizeof (dnptrs[0]); 181 /* 182 * perform opcode specific processing 183 */ 184 switch (op) { 185 case QUERY: 186 if ((buflen -= QFIXEDSZ) < 0) 187 return (-1); |
185 if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) | 188 if ((n = dn_comp((u_char *)dname, cp, buflen, 189 dnptrs, lastdnptr)) < 0) |
186 return (-1); 187 cp += n; 188 buflen -= n; 189 putshort(type, cp); 190 cp += sizeof (u_short); 191 putshort(class, cp); 192 cp += sizeof (u_short); 193 hp->qdcount = htons(1); 194 if (op == QUERY || data == NULL) 195 break; 196 /* 197 * Make an additional record for completion domain. 198 */ 199 buflen -= RRFIXEDSZ; | 190 return (-1); 191 cp += n; 192 buflen -= n; 193 putshort(type, cp); 194 cp += sizeof (u_short); 195 putshort(class, cp); 196 cp += sizeof (u_short); 197 hp->qdcount = htons(1); 198 if (op == QUERY || data == NULL) 199 break; 200 /* 201 * Make an additional record for completion domain. 202 */ 203 buflen -= RRFIXEDSZ; |
200 if ((n = dn_comp(data, cp, buflen, dnptrs, lastdnptr)) < 0) | 204 if ((n = dn_comp((u_char *)data, cp, buflen, 205 dnptrs, lastdnptr)) < 0) |
201 return (-1); 202 cp += n; 203 buflen -= n; 204 putshort(T_NULL, cp); 205 cp += sizeof (u_short); 206 putshort(class, cp); 207 cp += sizeof (u_short); 208 putlong(0, cp); --- 15 unchanged lines hidden (view full) --- 224 putshort(class, cp); 225 cp += sizeof (u_short); 226 putlong(0, cp); 227 cp += sizeof (u_long); 228 putshort(datalen, cp); 229 cp += sizeof (u_short); 230 if (datalen) { 231#ifdef SYSV | 206 return (-1); 207 cp += n; 208 buflen -= n; 209 putshort(T_NULL, cp); 210 cp += sizeof (u_short); 211 putshort(class, cp); 212 cp += sizeof (u_short); 213 putlong(0, cp); --- 15 unchanged lines hidden (view full) --- 229 putshort(class, cp); 230 cp += sizeof (u_short); 231 putlong(0, cp); 232 cp += sizeof (u_long); 233 putshort(datalen, cp); 234 cp += sizeof (u_short); 235 if (datalen) { 236#ifdef SYSV |
232 memcpy((void *)cp, (void *)data, datalen); | 237 (void) memcpy((void *)cp, (void *)data, datalen); |
233#else 234 bcopy(data, cp, datalen); 235#endif 236 cp += datalen; 237 } 238 hp->ancount = htons(1); 239 break; 240 --- 8 unchanged lines hidden (view full) --- 249 case UPDATED: 250 /* 251 * The res code for UPDATED and UPDATEDA is the same; user 252 * calls them differently: specifies data for UPDATED; server 253 * ignores data if specified for UPDATEDA. 254 */ 255 case UPDATEDA: 256 buflen -= RRFIXEDSZ + datalen; | 238#else 239 bcopy(data, cp, datalen); 240#endif 241 cp += datalen; 242 } 243 hp->ancount = htons(1); 244 break; 245 --- 8 unchanged lines hidden (view full) --- 254 case UPDATED: 255 /* 256 * The res code for UPDATED and UPDATEDA is the same; user 257 * calls them differently: specifies data for UPDATED; server 258 * ignores data if specified for UPDATEDA. 259 */ 260 case UPDATEDA: 261 buflen -= RRFIXEDSZ + datalen; |
257 if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) | 262 if ((n = dn_comp((u_char *)dname, cp, buflen, 263 dnptrs, lastdnptr)) < 0) |
258 return (-1); 259 cp += n; 260 putshort(type, cp); 261 cp += sizeof (u_short); 262 putshort(class, cp); 263 cp += sizeof (u_short); 264 putlong(0, cp); 265 cp += sizeof (u_long); --- 10 unchanged lines hidden (view full) --- 276 if ((op == UPDATED) || (op == UPDATEDA)) { 277 hp->ancount = htons(0); 278 break; 279 } 280 /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */ 281 282 case UPDATEA: /* Add new resource record */ 283 buflen -= RRFIXEDSZ + datalen; | 264 return (-1); 265 cp += n; 266 putshort(type, cp); 267 cp += sizeof (u_short); 268 putshort(class, cp); 269 cp += sizeof (u_short); 270 putlong(0, cp); 271 cp += sizeof (u_long); --- 10 unchanged lines hidden (view full) --- 282 if ((op == UPDATED) || (op == UPDATEDA)) { 283 hp->ancount = htons(0); 284 break; 285 } 286 /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */ 287 288 case UPDATEA: /* Add new resource record */ 289 buflen -= RRFIXEDSZ + datalen; |
284 if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) | 290 if ((n = dn_comp((u_char *)dname, cp, buflen, 291 dnptrs, lastdnptr)) < 0) |
285 return (-1); 286 cp += n; 287 putshort(newrr->r_type, cp); 288 cp += sizeof (u_short); 289 putshort(newrr->r_class, cp); 290 cp += sizeof (u_short); 291 putlong(0, cp); 292 cp += sizeof (u_long); --- 7 unchanged lines hidden (view full) --- 300#endif 301 cp += newrr->r_size; 302 } 303 hp->ancount = htons(0); 304 break; 305 306#endif /* ALLOW_UPDATES */ 307 } | 292 return (-1); 293 cp += n; 294 putshort(newrr->r_type, cp); 295 cp += sizeof (u_short); 296 putshort(newrr->r_class, cp); 297 cp += sizeof (u_short); 298 putlong(0, cp); 299 cp += sizeof (u_long); --- 7 unchanged lines hidden (view full) --- 307#endif 308 cp += newrr->r_size; 309 } 310 hp->ancount = htons(0); 311 break; 312 313#endif /* ALLOW_UPDATES */ 314 } |
308 return (cp - buf); | 315 return ((char *)cp - buf); |
309} | 316} |