r18534: Fix grammar
[Samba.git] / source / libaddns / dnsrecord.c
bloba840a9079ee0a0ed0a5d64c7ebc40f56a9503dc0
1 /*
2 Linux DNS client library implementation
3 Copyright (C) 2006 Krishna Ganugapati <krishnag@centeris.com>
4 Copyright (C) 2006 Gerald Carter <jerry@samba.org>
6 ** NOTE! The following LGPL license applies to the libaddns
7 ** library. This does NOT imply that all of Samba is released
8 ** under the LGPL
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 02110-1301 USA
26 #include "dns.h"
28 /*********************************************************************
29 *********************************************************************/
31 int32 DNSCreateDeleteRecord( char *szHost, int16 wClass,
32 int16 wType, DNS_RR_RECORD ** ppDNSRecord )
34 int32 dwError = 0;
35 DNS_RR_RECORD *pDNSRRRecord = NULL;
36 DNS_DOMAIN_NAME *pDomainName = NULL;
38 dwError = DNSDomainNameFromString( szHost, &pDomainName );
39 BAIL_ON_ERROR( dwError );
41 dwError = DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
42 ( void * ) &pDNSRRRecord );
43 BAIL_ON_ERROR( dwError );
45 pDNSRRRecord->RRHeader.dwTTL = 0;
46 pDNSRRRecord->RRHeader.wClass = wClass;
47 pDNSRRRecord->RRHeader.wType = wType;
48 pDNSRRRecord->RRHeader.pDomainName = pDomainName;
49 pDNSRRRecord->RRHeader.wRDataSize = 0;
51 *ppDNSRecord = pDNSRRRecord;
53 return dwError;
54 error:
56 if ( pDomainName ) {
57 DNSFreeDomainName( pDomainName );
59 if ( pDNSRRRecord ) {
60 DNSFreeMemory( pDNSRRRecord );
63 *ppDNSRecord = NULL;
64 return dwError;
67 /*********************************************************************
68 *********************************************************************/
70 int32 DNSCreateARecord( char *szHost, int16 wClass,
71 int16 wType, int32 dwIP, DNS_RR_RECORD ** ppDNSRecord )
73 int32 dwError = 0;
74 DNS_RR_RECORD *pDNSRRRecord = NULL;
75 DNS_DOMAIN_NAME *pDomainName = NULL;
76 uint8 *pRData = NULL;
77 int32 dwnIP = 0;
79 dwError = DNSDomainNameFromString( szHost, &pDomainName );
80 BAIL_ON_ERROR( dwError );
82 dwError =
83 DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
84 ( void * ) &pDNSRRRecord );
85 BAIL_ON_ERROR( dwError );
87 pDNSRRRecord->RRHeader.wType = wType;
88 pDNSRRRecord->RRHeader.pDomainName = pDomainName;
90 pDNSRRRecord->RRHeader.wClass = wClass;
91 pDNSRRRecord->RRHeader.wRDataSize = 0;
92 pDNSRRRecord->RRHeader.dwTTL = 0;
94 if ( wClass != DNS_CLASS_ANY ) {
95 pDNSRRRecord->RRHeader.dwTTL = DNS_ONE_DAY_IN_SECS;
96 pDNSRRRecord->RRHeader.wRDataSize = sizeof( int32 );
97 dwError =
98 DNSAllocateMemory( sizeof( int32 ),
99 ( void * ) &pRData );
100 dwnIP = htonl( dwIP );
101 memcpy( pRData, &dwnIP, sizeof( int32 ) );
102 pDNSRRRecord->pRData = pRData;
105 *ppDNSRecord = pDNSRRRecord;
107 return dwError;
108 error:
110 if ( pDomainName ) {
111 DNSFreeDomainName( pDomainName );
113 if ( pDNSRRRecord ) {
114 DNSFreeMemory( pDNSRRRecord );
117 if ( pDNSRRRecord ) {
118 DNSFreeMemory( pRData );
120 *ppDNSRecord = NULL;
121 return dwError;
124 /*********************************************************************
125 *********************************************************************/
127 int32 DNSCreateTKeyRecord( char *szKeyName, uint8 * pKeyData,
128 int16 wKeySize, DNS_RR_RECORD ** ppDNSRecord )
130 int32 dwError = 0;
131 DNS_RR_RECORD *pDNSRecord = NULL;
132 DNS_DOMAIN_NAME *pAlgorithmName = NULL;
133 DNS_DOMAIN_NAME *pDomainName = NULL;
134 time_t t;
136 int32 dwRDataSize = 0;
137 int32 dwnInception, dwInception = 0;
138 int32 dwnExpiration, dwExpiration = 0;
139 int16 wnMode, wMode = 0;
140 int16 wnError, wError = 0;
141 int16 wnKeySize = 0;
142 int16 wnOtherSize, wOtherSize = 0;
144 int32 dwAlgorithmLen = 0;
145 int32 dwCopied = 0;
146 int32 dwOffset = 0;
148 uint8 *pRData = NULL;
150 char szTemp[20];
152 dwError =
153 DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
154 ( void * ) &pDNSRecord );
155 BAIL_ON_ERROR( dwError );
157 dwError = DNSDomainNameFromString( szKeyName, &pDomainName );
158 BAIL_ON_ERROR( dwError );
160 strncpy( szTemp, "gss.microsoft.com", sizeof( szTemp ) );
161 dwError = DNSDomainNameFromString( szTemp, &pAlgorithmName );
162 BAIL_ON_ERROR( dwError );
164 pDNSRecord->RRHeader.dwTTL = 0;
165 pDNSRecord->RRHeader.pDomainName = pDomainName;
166 pDNSRecord->RRHeader.wClass = DNS_CLASS_ANY;
167 pDNSRecord->RRHeader.wType = QTYPE_TKEY;
169 time( &t );
170 dwExpiration = ( int32 ) t + DNS_ONE_DAY_IN_SECS;
171 dwInception = ( int32 ) t;
172 wError = 0;
173 wMode = 3;
175 dwError = DNSGetDomainNameLength( pAlgorithmName, &dwAlgorithmLen );
176 BAIL_ON_ERROR( dwError );
178 dwRDataSize = dwAlgorithmLen +
179 sizeof( dwExpiration ) + sizeof( dwInception ) +
180 sizeof( wError ) + sizeof( wMode ) + +sizeof( wError ) +
181 sizeof( wKeySize ) + wKeySize + sizeof( wOtherSize ) +
182 wOtherSize;
184 dwError = DNSAllocateMemory( dwRDataSize, ( void * ) &pRData );
185 BAIL_ON_ERROR( dwError );
187 dwnInception = htonl( dwInception );
188 dwnExpiration = htonl( dwExpiration );
189 wnMode = htons( wMode );
190 wnError = htons( wError );
191 wnKeySize = htons( wKeySize );
192 wnOtherSize = htons( wOtherSize );
194 dwError = DNSCopyDomainName( pRData, pAlgorithmName, &dwCopied );
195 BAIL_ON_ERROR( dwError );
196 dwOffset += dwCopied;
198 memcpy( pRData + dwOffset, &dwnInception, sizeof( int32 ) );
199 dwOffset += sizeof( int32 );
201 memcpy( pRData + dwOffset, &dwnExpiration, sizeof( int32 ) );
202 dwOffset += sizeof( int32 );
204 memcpy( pRData + dwOffset, &wnMode, sizeof( int16 ) );
205 dwOffset += sizeof( int16 );
207 memcpy( pRData + dwOffset, &wnError, sizeof( int16 ) );
208 dwOffset += sizeof( int16 );
210 memcpy( pRData + dwOffset, &wnKeySize, sizeof( int16 ) );
211 dwOffset += sizeof( int16 );
213 memcpy( pRData + dwOffset, pKeyData, wKeySize );
214 dwOffset += wKeySize;
216 memcpy( pRData + dwOffset, &wnOtherSize, sizeof( int16 ) );
217 dwOffset += sizeof( int16 );
219 pDNSRecord->RRHeader.wRDataSize = ( int16 ) dwRDataSize;
221 pDNSRecord->pRData = pRData;
222 *ppDNSRecord = pDNSRecord;
224 return dwError;
226 error:
229 if ( pDNSRecord ) {
230 DNSFreeMemory( pDNSRecord );
233 if ( pDomainName ) {
234 DNSFreeDomainName( pDomainName );
237 if ( pAlgorithmName ) {
238 DNSFreeDomainName( pAlgorithmName );
241 *ppDNSRecord = NULL;
242 return dwError;
245 /*********************************************************************
246 *********************************************************************/
248 int32 DNSCreateTSIGRecord( char *szKeyName, int32 dwTimeSigned,
249 int16 wFudge, int16 wOriginalID, uint8 * pMac,
250 int16 wMacSize, DNS_RR_RECORD ** ppDNSRecord )
252 int32 dwError = 0;
253 DNS_RR_RECORD *pDNSRecord = NULL;
254 DNS_DOMAIN_NAME *pAlgorithmName = NULL;
255 DNS_DOMAIN_NAME *pDomainName = NULL;
256 time_t t;
258 int32 dwRDataSize = 0;
260 int16 wnFudge = 0;
261 int16 wnError = 0, wError = 0;
262 int16 wnMacSize = 0;
263 int16 wnOriginalID = 0;
264 int16 wnOtherLen = 0, wOtherLen = 0;
266 int32 dwAlgorithmLen = 0;
267 int32 dwCopied = 0;
268 int32 dwOffset = 0;
270 uint8 *pRData = NULL;
272 int32 dwnTimeSigned = 0;
273 int16 wnTimePrefix = 0;
274 int16 wTimePrefix = 0;
276 char szTemp[20];
278 dwError =
279 DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
280 ( void * ) &pDNSRecord );
281 BAIL_ON_ERROR( dwError );
283 dwError = DNSDomainNameFromString( szKeyName, &pDomainName );
284 BAIL_ON_ERROR( dwError );
286 strncpy( szTemp, "gss.microsoft.com", sizeof( szTemp ) );
287 dwError = DNSDomainNameFromString( szTemp, &pAlgorithmName );
288 BAIL_ON_ERROR( dwError );
290 pDNSRecord->RRHeader.dwTTL = 0;
291 pDNSRecord->RRHeader.pDomainName = pDomainName;
292 pDNSRecord->RRHeader.wClass = DNS_CLASS_ANY;
293 pDNSRecord->RRHeader.wType = QTYPE_TSIG;
295 /* This needs to be a 48bit value - 6 octets. */
297 time( &t );
299 dwError = DNSGetDomainNameLength( pAlgorithmName, &dwAlgorithmLen );
300 BAIL_ON_ERROR( dwError );
302 dwRDataSize = dwAlgorithmLen + 6 + sizeof( wFudge ) + sizeof( wMacSize ) +
303 wMacSize + sizeof( wOriginalID ) + sizeof( wError ) +
304 sizeof( wOtherLen );
306 dwError = DNSAllocateMemory( dwRDataSize, ( void * ) &pRData );
307 BAIL_ON_ERROR( dwError );
309 /* Convert t to 48 bit network order */
311 wnTimePrefix = htons( wTimePrefix );
312 dwnTimeSigned = htonl( dwTimeSigned );
313 wnFudge = htons( wFudge );
314 wnMacSize = htons( wMacSize );
315 wnOriginalID = htons( wOriginalID );
316 wnError = htons( wError );
317 wnOtherLen = htons( wOtherLen );
319 dwError = DNSCopyDomainName( pRData, pAlgorithmName, &dwCopied );
320 BAIL_ON_ERROR( dwError );
321 dwOffset += dwCopied;
323 memcpy( pRData + dwOffset, &wnTimePrefix, sizeof( int16 ) );
324 dwOffset += sizeof( int16 );
326 memcpy( pRData + dwOffset, &dwnTimeSigned, sizeof( int32 ) );
327 dwOffset += sizeof( int32 );
329 memcpy( pRData + dwOffset, &wnFudge, sizeof( int16 ) );
330 dwOffset += sizeof( int16 );
333 memcpy( pRData + dwOffset, &wnMacSize, sizeof( int16 ) );
334 dwOffset += sizeof( int16 );
336 memcpy( pRData + dwOffset, pMac, wMacSize );
337 dwOffset += wMacSize;
339 memcpy( pRData + dwOffset, &wnOriginalID, sizeof( int16 ) );
340 dwOffset += sizeof( int16 );
342 memcpy( pRData + dwOffset, &wnError, sizeof( int16 ) );
343 dwOffset += sizeof( int16 );
345 memcpy( pRData + dwOffset, &wnOtherLen, sizeof( int16 ) );
346 dwOffset += sizeof( int16 );
348 pDNSRecord->RRHeader.wRDataSize = ( int16 ) dwRDataSize;
350 pDNSRecord->pRData = pRData;
351 *ppDNSRecord = pDNSRecord;
353 return dwError;
355 error:
358 if ( pDNSRecord ) {
359 DNSFreeMemory( pDNSRecord );
362 if ( pDomainName ) {
363 DNSFreeDomainName( pDomainName );
366 if ( pAlgorithmName ) {
367 DNSFreeDomainName( pAlgorithmName );
370 *ppDNSRecord = NULL;
371 return dwError;
374 /*********************************************************************
375 *********************************************************************/
377 int32 DNSCreateQuestionRecord( char *pszQName, int16 wQType,
378 int16 wQClass,
379 DNS_QUESTION_RECORD ** ppDNSQuestionRecord )
381 int32 dwError = 0;
382 DNS_QUESTION_RECORD *pDNSQuestionRecord = NULL;
383 DNS_DOMAIN_NAME *pDomainName = NULL;
385 dwError = DNSDomainNameFromString( pszQName, &pDomainName );
386 BAIL_ON_ERROR( dwError );
388 dwError =
389 DNSAllocateMemory( sizeof( DNS_QUESTION_RECORD ),
390 ( void * ) &pDNSQuestionRecord );
391 BAIL_ON_ERROR( dwError );
393 pDNSQuestionRecord->pDomainName = pDomainName;
394 pDNSQuestionRecord->wQueryClass = wQClass;
395 pDNSQuestionRecord->wQueryType = wQType;
397 *ppDNSQuestionRecord = pDNSQuestionRecord;
399 return dwError;
400 error:
402 if ( pDomainName ) {
403 DNSFreeDomainName( pDomainName );
405 if ( pDNSQuestionRecord ) {
406 DNSFreeMemory( pDNSQuestionRecord );
408 *ppDNSQuestionRecord = NULL;
409 return dwError;
412 /*********************************************************************
413 *********************************************************************/
415 int32 DNSCreateZoneRecord( const char *pszZName, DNS_ZONE_RECORD ** ppDNSZoneRecord )
417 int32 dwError = 0;
418 DNS_ZONE_RECORD *pDNSZoneRecord = NULL;
419 DNS_DOMAIN_NAME *pDomainName = NULL;
421 dwError = DNSDomainNameFromString( pszZName, &pDomainName );
422 BAIL_ON_ERROR( dwError );
424 dwError =
425 DNSAllocateMemory( sizeof( DNS_ZONE_RECORD ),
426 ( void * ) &pDNSZoneRecord );
427 BAIL_ON_ERROR( dwError );
429 pDNSZoneRecord->pDomainName = pDomainName;
430 pDNSZoneRecord->wZoneClass = DNS_CLASS_IN;
431 pDNSZoneRecord->wZoneType = QTYPE_SOA;
433 *ppDNSZoneRecord = pDNSZoneRecord;
435 return dwError;
436 error:
438 if ( pDomainName ) {
439 DNSFreeDomainName( pDomainName );
441 if ( pDNSZoneRecord ) {
442 DNSFreeMemory( pDNSZoneRecord );
444 *ppDNSZoneRecord = NULL;
445 return dwError;
448 int32 DNSFreeZoneRecord( DNS_ZONE_RECORD * pDNSZoneRecord )
450 int32 dwError = 0;
452 return dwError;
456 /*********************************************************************
457 *********************************************************************/
459 int32 DNSCreateNameInUseRecord( char *pszName, int32 qtype,
460 struct in_addr * ip,
461 DNS_RR_RECORD * *ppDNSRRRecord )
463 int32 dwError = 0;
464 DNS_RR_RECORD *pDNSRRRecord = NULL;
465 DNS_DOMAIN_NAME *pDomainName = NULL;
467 dwError = DNSDomainNameFromString( pszName, &pDomainName );
468 BAIL_ON_ERROR( dwError );
470 dwError =
471 DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
472 ( void * ) &pDNSRRRecord );
473 BAIL_ON_ERROR( dwError );
475 pDNSRRRecord->RRHeader.pDomainName = pDomainName;
476 pDNSRRRecord->RRHeader.dwTTL = 0;
477 pDNSRRRecord->RRHeader.wType = qtype;
479 if ( !ip ) {
480 pDNSRRRecord->RRHeader.wClass = DNS_CLASS_ANY;
481 pDNSRRRecord->RRHeader.wRDataSize = 0;
482 } else {
483 pDNSRRRecord->RRHeader.wClass = DNS_CLASS_IN;
484 pDNSRRRecord->RRHeader.wRDataSize = 4;
485 dwError =
486 DNSAllocateMemory( 4,
487 ( void * ) &pDNSRRRecord->
488 pRData );
489 BAIL_ON_ERROR( dwError );
490 memcpy( pDNSRRRecord->pRData, &ip->s_addr, 4 );
493 *ppDNSRRRecord = pDNSRRRecord;
495 return dwError;
496 error:
498 if ( pDomainName ) {
499 DNSFreeDomainName( pDomainName );
501 if ( pDNSRRRecord ) {
502 DNSFreeMemory( pDNSRRRecord );
504 *ppDNSRRRecord = NULL;
506 return dwError;
509 /*********************************************************************
510 *********************************************************************/
512 int32 DNSCreateNameNotInUseRecord( char *pszName, int32 qtype,
513 DNS_RR_RECORD * *ppDNSRRRecord )
515 int32 dwError = 0;
516 DNS_RR_RECORD *pDNSRRRecord = NULL;
517 DNS_DOMAIN_NAME *pDomainName = NULL;
519 dwError = DNSDomainNameFromString( pszName, &pDomainName );
520 BAIL_ON_ERROR( dwError );
522 dwError =
523 DNSAllocateMemory( sizeof( DNS_RR_RECORD ),
524 ( void * ) &pDNSRRRecord );
525 BAIL_ON_ERROR( dwError );
527 pDNSRRRecord->RRHeader.pDomainName = pDomainName;
528 pDNSRRRecord->RRHeader.wClass = DNS_CLASS_NONE;
529 pDNSRRRecord->RRHeader.wType = qtype;
530 pDNSRRRecord->RRHeader.dwTTL = 0;
531 pDNSRRRecord->RRHeader.wRDataSize = 0;
533 *ppDNSRRRecord = pDNSRRRecord;
535 return dwError;
536 error:
538 if ( pDomainName ) {
539 DNSFreeDomainName( pDomainName );
541 if ( pDNSRRRecord ) {
542 DNSFreeMemory( pDNSRRRecord );
544 *ppDNSRRRecord = NULL;
545 return dwError;