summaryrefslogtreecommitdiff
path: root/source3/libaddns/dnsuprequest.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/libaddns/dnsuprequest.c')
-rw-r--r--source3/libaddns/dnsuprequest.c428
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;
+}