diff options
Diffstat (limited to 'source3/libaddns/dnsuprequest.c')
-rw-r--r-- | source3/libaddns/dnsuprequest.c | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/source3/libaddns/dnsuprequest.c b/source3/libaddns/dnsuprequest.c new file mode 100644 index 0000000000..d8188d5f58 --- /dev/null +++ b/source3/libaddns/dnsuprequest.c @@ -0,0 +1,428 @@ +/* + Linux DNS client library implementation + + Copyright (C) 2006 Krishna Ganugapati <krishnag@centeris.com> + Copyright (C) 2006 Gerald Carter <jerry@samba.org> + + ** NOTE! The following LGPL license applies to the libaddns + ** library. This does NOT imply that all of Samba is released + ** under the LGPL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#include "dns.h" + +/********************************************************************* +*********************************************************************/ + +static int32 DNSUpdateMarshallZoneSection( HANDLE hSendBuffer, + DNS_ZONE_RECORD ** ppDNSZoneRecords, + int16 wZones ) +{ + int32 dwError = 0; + int32 i = 0; + int32 dwRead = 0; + DNS_ZONE_RECORD *pDNSZoneRecord = NULL; + int16 wnZoneType = 0; + int16 wnZoneClass = 0; + + for ( i = 0; i < wZones; i++ ) { + + pDNSZoneRecord = *( ppDNSZoneRecords + i ); + dwError = + DNSMarshallDomainName( hSendBuffer, + pDNSZoneRecord->pDomainName ); + BAIL_ON_ERROR( dwError ); + + wnZoneType = htons( pDNSZoneRecord->wZoneType ); + dwError = + DNSMarshallBuffer( hSendBuffer, + ( uint8 * ) & wnZoneType, + ( int32 ) sizeof( int16 ), + &dwRead ); + BAIL_ON_ERROR( dwError ); + + wnZoneClass = htons( pDNSZoneRecord->wZoneClass ); + dwError = + DNSMarshallBuffer( hSendBuffer, + ( uint8 * ) & wnZoneClass, + ( int32 ) sizeof( int16 ), + &dwRead ); + BAIL_ON_ERROR( dwError ); + + pDNSZoneRecord++; + } + + error: + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +static int32 DNSUpdateMarshallPRSection( HANDLE hSendBuffer, + DNS_RR_RECORD ** ppDNSPRRRRecords, int16 wPRs ) +{ + int32 dwError = 0; + int32 i = 0; + DNS_RR_RECORD *pDNSPRRRRecord = NULL; + + + for ( i = 0; i < wPRs; i++ ) { + + pDNSPRRRRecord = *( ppDNSPRRRRecords + i ); + + dwError = DNSMarshallRRHeader( hSendBuffer, pDNSPRRRRecord ); + BAIL_ON_ERROR( dwError ); + + if ( pDNSPRRRRecord->RRHeader.wRDataSize ) { + dwError = + DNSMarshallRData( hSendBuffer, + pDNSPRRRRecord ); + BAIL_ON_ERROR( dwError ); + } + } + error: + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +static int32 DNSUpdateMarshallUpdateSection( HANDLE hSendBuffer, + DNS_RR_RECORD ** ppDNSUpdateRRRecords, + int16 wZones ) +{ + int32 dwError = 0; + int32 i = 0; + DNS_RR_RECORD *pDNSUpdateRRRecord = NULL; + + for ( i = 0; i < wZones; i++ ) { + + pDNSUpdateRRRecord = *( ppDNSUpdateRRRecords + i ); + + dwError = + DNSMarshallRRHeader( hSendBuffer, + pDNSUpdateRRRecord ); + + if ( pDNSUpdateRRRecord->RRHeader.wRDataSize ) { + dwError = DNSMarshallRData( hSendBuffer, + pDNSUpdateRRRecord ); + BAIL_ON_ERROR( dwError ); + } + + } + error: + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +static int32 DNSUpdateMarshallAdditionalSection( HANDLE hSendBuffer, + DNS_RR_RECORD ** + ppDNSAdditionalsRRRecords, + int16 wAdditionals ) +{ + int32 dwError = 0; + int32 i = 0; + DNS_RR_RECORD *pDNSAdditionalRRRecord = NULL; + + for ( i = 0; i < wAdditionals; i++ ) { + + pDNSAdditionalRRRecord = *( ppDNSAdditionalsRRRecords + i ); + + dwError = + DNSMarshallRRHeader( hSendBuffer, + pDNSAdditionalRRRecord ); + BAIL_ON_ERROR( dwError ); + + if ( pDNSAdditionalRRRecord->RRHeader.wRDataSize ) { + dwError = DNSMarshallRData( hSendBuffer, + pDNSAdditionalRRRecord ); + BAIL_ON_ERROR( dwError ); + } + } + + error: + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateSendUpdateRequest2( HANDLE hDNSServer, + DNS_UPDATE_REQUEST * pDNSRequest ) +{ + int32 dwError = 0; + int32 dwBytesSent = 0; + HANDLE hSendBuffer = ( HANDLE ) NULL; + + dwError = DNSUpdateBuildRequestMessage( pDNSRequest, &hSendBuffer ); + BAIL_ON_ERROR( dwError ); + + dwError = + DNSSendBufferContext( hDNSServer, hSendBuffer, &dwBytesSent ); + BAIL_ON_ERROR( dwError ); + + error: + + if ( hSendBuffer ) { + DNSFreeSendBufferContext( hSendBuffer ); + } + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateBuildRequestMessage( DNS_UPDATE_REQUEST * pDNSRequest, + HANDLE * phSendBuffer ) +{ + int32 dwError = 0; + char DNSMessageHeader[12]; + int16 wnIdentification = 0; + int16 wnParameter = 0; + int16 wnZones = 0; + int16 wnPRs = 0; + int16 wnUpdates = 0; + int16 wnAdditionals = 0; + int32 dwRead = 0; + HANDLE hSendBuffer = ( HANDLE ) NULL; + + dwError = DNSCreateSendBuffer( &hSendBuffer ); + BAIL_ON_ERROR( dwError ); + + wnIdentification = htons( pDNSRequest->wIdentification ); + memcpy( DNSMessageHeader, ( char * ) &wnIdentification, 2 ); + + wnParameter = htons( pDNSRequest->wParameter ); + memcpy( DNSMessageHeader + 2, ( char * ) &wnParameter, 2 ); + + wnZones = htons( pDNSRequest->wZones ); + memcpy( DNSMessageHeader + 4, ( char * ) &wnZones, 2 ); + + wnPRs = htons( pDNSRequest->wPRs ); + memcpy( DNSMessageHeader + 6, ( char * ) &wnPRs, 2 ); + + wnUpdates = htons( pDNSRequest->wUpdates ); + memcpy( DNSMessageHeader + 8, ( char * ) &wnUpdates, 2 ); + + wnAdditionals = htons( pDNSRequest->wAdditionals ); + memcpy( DNSMessageHeader + 10, ( char * ) &wnAdditionals, 2 ); + + dwError = + DNSMarshallBuffer( hSendBuffer, ( uint8 * ) DNSMessageHeader, + 12, &dwRead ); + BAIL_ON_ERROR( dwError ); + + if ( pDNSRequest->wZones ) { + dwError = + DNSUpdateMarshallZoneSection( hSendBuffer, + pDNSRequest-> + ppZoneRRSet, + pDNSRequest->wZones ); + BAIL_ON_ERROR( dwError ); + } + + if ( pDNSRequest->wPRs ) { + dwError = + DNSUpdateMarshallPRSection( hSendBuffer, + pDNSRequest->ppPRRRSet, + pDNSRequest->wPRs ); + BAIL_ON_ERROR( dwError ); + } + + if ( pDNSRequest->wUpdates ) { + dwError = + DNSUpdateMarshallUpdateSection( hSendBuffer, + pDNSRequest-> + ppUpdateRRSet, + pDNSRequest-> + wUpdates ); + BAIL_ON_ERROR( dwError ); + } + + if ( pDNSRequest->wAdditionals ) { + dwError = + DNSUpdateMarshallAdditionalSection( hSendBuffer, + pDNSRequest-> + ppAdditionalRRSet, + pDNSRequest-> + wAdditionals ); + BAIL_ON_ERROR( dwError ); + } +#if 0 + DNSDumpSendBufferContext( hSendBuffer ); +#endif + + *phSendBuffer = hSendBuffer; + + return dwError; + + error: + + if ( hSendBuffer ) { + DNSFreeSendBufferContext( hSendBuffer ); + } + + *phSendBuffer = ( HANDLE ) NULL; + return dwError; +} + + +/********************************************************************* +*********************************************************************/ + +void DNSUpdateFreeRequest( DNS_UPDATE_REQUEST * pDNSRequest ) +{ + return; +} + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateAddZoneSection( DNS_UPDATE_REQUEST * pDNSRequest, + DNS_ZONE_RECORD * pDNSZone ) +{ + int32 dwNumZones = 0; + int32 dwError = 0; + + dwNumZones = pDNSRequest->wZones; + + dwError = DNSReallocMemory( ( uint8 * ) pDNSRequest->ppZoneRRSet, + ( void ** ) &pDNSRequest->ppZoneRRSet, + ( dwNumZones + + 1 ) * sizeof( DNS_ZONE_RECORD * ) + ); + BAIL_ON_ERROR( dwError ); + + *( pDNSRequest->ppZoneRRSet + dwNumZones ) = pDNSZone; + + pDNSRequest->wZones += 1; + + error: + + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateAddAdditionalSection( DNS_UPDATE_REQUEST * pDNSRequest, + DNS_RR_RECORD * pDNSRecord ) +{ + int32 dwNumAdditionals = 0; + int32 dwError = 0; + + dwNumAdditionals = pDNSRequest->wAdditionals; + dwError = DNSReallocMemory( pDNSRequest->ppAdditionalRRSet, + ( void ** ) &pDNSRequest-> + ppAdditionalRRSet, + ( dwNumAdditionals + + 1 ) * sizeof( DNS_RR_RECORD * ) ); + BAIL_ON_ERROR( dwError ); + + *( pDNSRequest->ppAdditionalRRSet + dwNumAdditionals ) = pDNSRecord; + + pDNSRequest->wAdditionals += 1; + + error: + return dwError; +} + +int32 DNSUpdateAddPRSection( DNS_UPDATE_REQUEST * pDNSRequest, + DNS_RR_RECORD * pDNSRecord ) +{ + int32 dwNumPRs = 0; + int32 dwError = 0; + + dwNumPRs = pDNSRequest->wPRs; + dwError = DNSReallocMemory( pDNSRequest->ppPRRRSet, + ( void ** ) &pDNSRequest->ppPRRRSet, + ( dwNumPRs + + 1 ) * sizeof( DNS_RR_RECORD * ) ); + BAIL_ON_ERROR( dwError ); + + *( pDNSRequest->ppPRRRSet + dwNumPRs ) = pDNSRecord; + + pDNSRequest->wPRs += 1; + + error: + return dwError; +} + + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateAddUpdateSection( DNS_UPDATE_REQUEST * pDNSRequest, + DNS_RR_RECORD * pDNSRecord ) +{ + int32 dwError = 0; + int16 wNumUpdates = 0; + + wNumUpdates = pDNSRequest->wUpdates; + dwError = DNSReallocMemory( pDNSRequest->ppUpdateRRSet, + ( void ** ) &pDNSRequest->ppUpdateRRSet, + ( wNumUpdates + + 1 ) * sizeof( DNS_RR_RECORD * ) ); + BAIL_ON_ERROR( dwError ); + + *( pDNSRequest->ppUpdateRRSet + wNumUpdates ) = pDNSRecord; + + pDNSRequest->wUpdates += 1; + + error: + return dwError; +} + +/********************************************************************* +*********************************************************************/ + +int32 DNSUpdateCreateUpdateRequest( DNS_UPDATE_REQUEST ** ppDNSRequest ) +{ + int32 dwError = 0; + DNS_UPDATE_REQUEST *pDNSRequest = NULL; + + dwError = + DNSAllocateMemory( sizeof( DNS_UPDATE_REQUEST ), + ( void ** ) &pDNSRequest ); + BAIL_ON_ERROR( dwError ); + + dwError = DNSGenerateIdentifier( &pDNSRequest->wIdentification ); + BAIL_ON_ERROR( dwError ); + + pDNSRequest->wParameter = 0x2800; + + *ppDNSRequest = pDNSRequest; + + return dwError; + + error: + + if ( pDNSRequest ) { + DNSUpdateFreeRequest( pDNSRequest ); + } + *ppDNSRequest = NULL; + return dwError; +} |