From c2aae726ea3f697c50f8d2304e2a9e69c56ab90f Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 17 Nov 2006 21:46:26 +0000 Subject: r19762: libaddns/*[ch] code fixes donated by Centeris Corporation (http://www.centeris.com/) under my copyright. * Rework error reporting to use DNS_ERROR instead of int32 * Convert memory allocation to use talloc() * Generalize the DNS request/response packet marshalling * Fix the secure update requests (This used to be commit c78798333616c3f823514df0f58da2eb3a30a988) --- source3/libaddns/dnsrecord.c | 727 +++++++++++++++++-------------------------- 1 file changed, 293 insertions(+), 434 deletions(-) (limited to 'source3/libaddns/dnsrecord.c') diff --git a/source3/libaddns/dnsrecord.c b/source3/libaddns/dnsrecord.c index a840a9079e..6dfb8edf5c 100644 --- a/source3/libaddns/dnsrecord.c +++ b/source3/libaddns/dnsrecord.c @@ -25,524 +25,383 @@ #include "dns.h" -/********************************************************************* -*********************************************************************/ - -int32 DNSCreateDeleteRecord( char *szHost, int16 wClass, - int16 wType, DNS_RR_RECORD ** ppDNSRecord ) +DNS_ERROR dns_create_query( TALLOC_CTX *mem_ctx, const char *name, + uint16 q_type, uint16 q_class, + struct dns_request **preq ) { - int32 dwError = 0; - DNS_RR_RECORD *pDNSRRRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - - dwError = DNSDomainNameFromString( szHost, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRRRecord ); - BAIL_ON_ERROR( dwError ); - - pDNSRRRecord->RRHeader.dwTTL = 0; - pDNSRRRecord->RRHeader.wClass = wClass; - pDNSRRRecord->RRHeader.wType = wType; - pDNSRRRecord->RRHeader.pDomainName = pDomainName; - pDNSRRRecord->RRHeader.wRDataSize = 0; + struct dns_request *req; + struct dns_question *q; + DNS_ERROR err; + + if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_request)) || + !(req->questions = TALLOC_ARRAY(req, struct dns_question *, 1)) || + !(req->questions[0] = talloc(req->questions, + struct dns_question))) { + TALLOC_FREE(req); + return ERROR_DNS_NO_MEMORY; + } - *ppDNSRecord = pDNSRRRecord; + req->id = random(); - return dwError; - error: + req->num_questions = 1; + q = req->questions[0]; - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); - } - if ( pDNSRRRecord ) { - DNSFreeMemory( pDNSRRRecord ); + err = dns_domain_name_from_string(q, name, &q->name); + if (!ERR_DNS_IS_OK(err)) { + TALLOC_FREE(req); + return err; } - *ppDNSRecord = NULL; - return dwError; -} + q->q_type = q_type; + q->q_class = q_class; -/********************************************************************* -*********************************************************************/ + *preq = req; + return ERROR_DNS_SUCCESS; +} -int32 DNSCreateARecord( char *szHost, int16 wClass, - int16 wType, int32 dwIP, DNS_RR_RECORD ** ppDNSRecord ) +DNS_ERROR dns_create_update( TALLOC_CTX *mem_ctx, const char *name, + struct dns_update_request **preq ) { - int32 dwError = 0; - DNS_RR_RECORD *pDNSRRRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - uint8 *pRData = NULL; - int32 dwnIP = 0; - - dwError = DNSDomainNameFromString( szHost, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRRRecord ); - BAIL_ON_ERROR( dwError ); - - pDNSRRRecord->RRHeader.wType = wType; - pDNSRRRecord->RRHeader.pDomainName = pDomainName; - - pDNSRRRecord->RRHeader.wClass = wClass; - pDNSRRRecord->RRHeader.wRDataSize = 0; - pDNSRRRecord->RRHeader.dwTTL = 0; - - if ( wClass != DNS_CLASS_ANY ) { - pDNSRRRecord->RRHeader.dwTTL = DNS_ONE_DAY_IN_SECS; - pDNSRRRecord->RRHeader.wRDataSize = sizeof( int32 ); - dwError = - DNSAllocateMemory( sizeof( int32 ), - ( void * ) &pRData ); - dwnIP = htonl( dwIP ); - memcpy( pRData, &dwnIP, sizeof( int32 ) ); - pDNSRRRecord->pRData = pRData; + struct dns_update_request *req; + struct dns_zone *z; + DNS_ERROR err; + + if (!(req = TALLOC_ZERO_P(mem_ctx, struct dns_update_request)) || + !(req->zones = TALLOC_ARRAY(req, struct dns_zone *, 1)) || + !(req->zones[0] = talloc(req->zones, struct dns_zone))) { + TALLOC_FREE(req); + return ERROR_DNS_NO_MEMORY; } - *ppDNSRecord = pDNSRRRecord; + req->id = random(); + req->flags = 0x2800; /* Dynamic update */ - return dwError; - error: + req->num_zones = 1; + z = req->zones[0]; - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); - } - if ( pDNSRRRecord ) { - DNSFreeMemory( pDNSRRRecord ); + err = dns_domain_name_from_string(z, name, &z->name); + if (!ERR_DNS_IS_OK(err)) { + TALLOC_FREE(req); + return err; } - if ( pDNSRRRecord ) { - DNSFreeMemory( pRData ); - } - *ppDNSRecord = NULL; - return dwError; -} + z->z_type = QTYPE_SOA; + z->z_class = DNS_CLASS_IN; -/********************************************************************* -*********************************************************************/ + *preq = req; + return ERROR_DNS_SUCCESS; +} -int32 DNSCreateTKeyRecord( char *szKeyName, uint8 * pKeyData, - int16 wKeySize, DNS_RR_RECORD ** ppDNSRecord ) +DNS_ERROR dns_create_rrec(TALLOC_CTX *mem_ctx, const char *name, + uint16 type, uint16 r_class, uint32 ttl, + uint16 data_length, uint8 *data, + struct dns_rrec **prec) { - int32 dwError = 0; - DNS_RR_RECORD *pDNSRecord = NULL; - DNS_DOMAIN_NAME *pAlgorithmName = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - time_t t; - - int32 dwRDataSize = 0; - int32 dwnInception, dwInception = 0; - int32 dwnExpiration, dwExpiration = 0; - int16 wnMode, wMode = 0; - int16 wnError, wError = 0; - int16 wnKeySize = 0; - int16 wnOtherSize, wOtherSize = 0; - - int32 dwAlgorithmLen = 0; - int32 dwCopied = 0; - int32 dwOffset = 0; - - uint8 *pRData = NULL; - - char szTemp[20]; - - dwError = - DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSDomainNameFromString( szKeyName, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - strncpy( szTemp, "gss.microsoft.com", sizeof( szTemp ) ); - dwError = DNSDomainNameFromString( szTemp, &pAlgorithmName ); - BAIL_ON_ERROR( dwError ); - - pDNSRecord->RRHeader.dwTTL = 0; - pDNSRecord->RRHeader.pDomainName = pDomainName; - pDNSRecord->RRHeader.wClass = DNS_CLASS_ANY; - pDNSRecord->RRHeader.wType = QTYPE_TKEY; - - time( &t ); - dwExpiration = ( int32 ) t + DNS_ONE_DAY_IN_SECS; - dwInception = ( int32 ) t; - wError = 0; - wMode = 3; - - dwError = DNSGetDomainNameLength( pAlgorithmName, &dwAlgorithmLen ); - BAIL_ON_ERROR( dwError ); - - dwRDataSize = dwAlgorithmLen + - sizeof( dwExpiration ) + sizeof( dwInception ) + - sizeof( wError ) + sizeof( wMode ) + +sizeof( wError ) + - sizeof( wKeySize ) + wKeySize + sizeof( wOtherSize ) + - wOtherSize; - - dwError = DNSAllocateMemory( dwRDataSize, ( void * ) &pRData ); - BAIL_ON_ERROR( dwError ); + struct dns_rrec *rec; + DNS_ERROR err; - dwnInception = htonl( dwInception ); - dwnExpiration = htonl( dwExpiration ); - wnMode = htons( wMode ); - wnError = htons( wError ); - wnKeySize = htons( wKeySize ); - wnOtherSize = htons( wOtherSize ); - - dwError = DNSCopyDomainName( pRData, pAlgorithmName, &dwCopied ); - BAIL_ON_ERROR( dwError ); - dwOffset += dwCopied; - - memcpy( pRData + dwOffset, &dwnInception, sizeof( int32 ) ); - dwOffset += sizeof( int32 ); - - memcpy( pRData + dwOffset, &dwnExpiration, sizeof( int32 ) ); - dwOffset += sizeof( int32 ); - - memcpy( pRData + dwOffset, &wnMode, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); - - memcpy( pRData + dwOffset, &wnError, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); - - memcpy( pRData + dwOffset, &wnKeySize, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); - - memcpy( pRData + dwOffset, pKeyData, wKeySize ); - dwOffset += wKeySize; - - memcpy( pRData + dwOffset, &wnOtherSize, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); - - pDNSRecord->RRHeader.wRDataSize = ( int16 ) dwRDataSize; - - pDNSRecord->pRData = pRData; - *ppDNSRecord = pDNSRecord; - - return dwError; - - error: - - - if ( pDNSRecord ) { - DNSFreeMemory( pDNSRecord ); + if (!(rec = talloc(mem_ctx, struct dns_rrec))) { + return ERROR_DNS_NO_MEMORY; } - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); + err = dns_domain_name_from_string(rec, name, &rec->name); + if (!(ERR_DNS_IS_OK(err))) { + TALLOC_FREE(rec); + return err; } - if ( pAlgorithmName ) { - DNSFreeDomainName( pAlgorithmName ); - } + rec->type = type; + rec->r_class = r_class; + rec->ttl = ttl; + rec->data_length = data_length; + rec->data = talloc_move(rec, &data); - *ppDNSRecord = NULL; - return dwError; + *prec = rec; + return ERROR_DNS_SUCCESS; } -/********************************************************************* -*********************************************************************/ - -int32 DNSCreateTSIGRecord( char *szKeyName, int32 dwTimeSigned, - int16 wFudge, int16 wOriginalID, uint8 * pMac, - int16 wMacSize, DNS_RR_RECORD ** ppDNSRecord ) +DNS_ERROR dns_create_a_record(TALLOC_CTX *mem_ctx, const char *host, + uint32 ttl, in_addr_t ip, + struct dns_rrec **prec) { - int32 dwError = 0; - DNS_RR_RECORD *pDNSRecord = NULL; - DNS_DOMAIN_NAME *pAlgorithmName = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - time_t t; - - int32 dwRDataSize = 0; - - int16 wnFudge = 0; - int16 wnError = 0, wError = 0; - int16 wnMacSize = 0; - int16 wnOriginalID = 0; - int16 wnOtherLen = 0, wOtherLen = 0; - - int32 dwAlgorithmLen = 0; - int32 dwCopied = 0; - int32 dwOffset = 0; - - uint8 *pRData = NULL; - - int32 dwnTimeSigned = 0; - int16 wnTimePrefix = 0; - int16 wTimePrefix = 0; - - char szTemp[20]; - - dwError = - DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRecord ); - BAIL_ON_ERROR( dwError ); - - dwError = DNSDomainNameFromString( szKeyName, &pDomainName ); - BAIL_ON_ERROR( dwError ); + uint8 *data; + DNS_ERROR err; - strncpy( szTemp, "gss.microsoft.com", sizeof( szTemp ) ); - dwError = DNSDomainNameFromString( szTemp, &pAlgorithmName ); - BAIL_ON_ERROR( dwError ); - - pDNSRecord->RRHeader.dwTTL = 0; - pDNSRecord->RRHeader.pDomainName = pDomainName; - pDNSRecord->RRHeader.wClass = DNS_CLASS_ANY; - pDNSRecord->RRHeader.wType = QTYPE_TSIG; + if (!(data = (uint8 *)TALLOC_MEMDUP(mem_ctx, (const void *)&ip, + sizeof(ip)))) { + return ERROR_DNS_NO_MEMORY; + } - /* This needs to be a 48bit value - 6 octets. */ + err = dns_create_rrec(mem_ctx, host, QTYPE_A, DNS_CLASS_IN, ttl, + sizeof(ip), data, prec); - time( &t ); + if (!ERR_DNS_IS_OK(err)) { + TALLOC_FREE(data); + } - dwError = DNSGetDomainNameLength( pAlgorithmName, &dwAlgorithmLen ); - BAIL_ON_ERROR( dwError ); + return err; +} - dwRDataSize = dwAlgorithmLen + 6 + sizeof( wFudge ) + sizeof( wMacSize ) + - wMacSize + sizeof( wOriginalID ) + sizeof( wError ) + - sizeof( wOtherLen ); +DNS_ERROR dns_create_name_in_use_record(TALLOC_CTX *mem_ctx, + const char *name, + const in_addr_t *ip, + struct dns_rrec **prec) +{ + if (ip != NULL) { + return dns_create_a_record(mem_ctx, name, 0, *ip, prec); + } - dwError = DNSAllocateMemory( dwRDataSize, ( void * ) &pRData ); - BAIL_ON_ERROR( dwError ); + return dns_create_rrec(mem_ctx, name, QTYPE_ANY, DNS_CLASS_IN, 0, 0, + NULL, prec); +} - /* Convert t to 48 bit network order */ +DNS_ERROR dns_create_name_not_in_use_record(TALLOC_CTX *mem_ctx, + const char *name, uint32 type, + struct dns_rrec **prec) +{ + return dns_create_rrec(mem_ctx, name, type, DNS_CLASS_NONE, 0, + 0, NULL, prec); +} - wnTimePrefix = htons( wTimePrefix ); - dwnTimeSigned = htonl( dwTimeSigned ); - wnFudge = htons( wFudge ); - wnMacSize = htons( wMacSize ); - wnOriginalID = htons( wOriginalID ); - wnError = htons( wError ); - wnOtherLen = htons( wOtherLen ); +DNS_ERROR dns_create_delete_record(TALLOC_CTX *mem_ctx, const char *name, + uint16 type, uint16 r_class, + struct dns_rrec **prec) +{ + return dns_create_rrec(mem_ctx, name, type, r_class, 0, 0, NULL, prec); +} - dwError = DNSCopyDomainName( pRData, pAlgorithmName, &dwCopied ); - BAIL_ON_ERROR( dwError ); - dwOffset += dwCopied; +DNS_ERROR dns_create_tkey_record(TALLOC_CTX *mem_ctx, const char *keyname, + const char *algorithm_name, time_t inception, + time_t expiration, uint16 mode, uint16 error, + uint16 key_length, const uint8 *key, + struct dns_rrec **prec) +{ + struct dns_buffer *buf; + struct dns_domain_name *algorithm; + DNS_ERROR err; - memcpy( pRData + dwOffset, &wnTimePrefix, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); + if (!(buf = dns_create_buffer(mem_ctx))) { + return ERROR_DNS_NO_MEMORY; + } - memcpy( pRData + dwOffset, &dwnTimeSigned, sizeof( int32 ) ); - dwOffset += sizeof( int32 ); + err = dns_domain_name_from_string(buf, algorithm_name, &algorithm); + if (!ERR_DNS_IS_OK(err)) goto error; + + dns_marshall_domain_name(buf, algorithm); + dns_marshall_uint32(buf, inception); + dns_marshall_uint32(buf, expiration); + dns_marshall_uint16(buf, mode); + dns_marshall_uint16(buf, error); + dns_marshall_uint16(buf, key_length); + dns_marshall_buffer(buf, key, key_length); + dns_marshall_uint16(buf, 0); /* Other Size */ + + if (!ERR_DNS_IS_OK(buf->error)) { + err = buf->error; + goto error; + } - memcpy( pRData + dwOffset, &wnFudge, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); + err = dns_create_rrec(mem_ctx, keyname, QTYPE_TKEY, DNS_CLASS_ANY, 0, + buf->offset, buf->data, prec); + error: + TALLOC_FREE(buf); + return err; +} - memcpy( pRData + dwOffset, &wnMacSize, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); +DNS_ERROR dns_unmarshall_tkey_record(TALLOC_CTX *mem_ctx, struct dns_rrec *rec, + struct dns_tkey_record **ptkey) +{ + struct dns_tkey_record *tkey; + struct dns_buffer buf; + uint32 tmp_inception, tmp_expiration; + + if (!(tkey = talloc(mem_ctx, struct dns_tkey_record))) { + return ERROR_DNS_NO_MEMORY; + } - memcpy( pRData + dwOffset, pMac, wMacSize ); - dwOffset += wMacSize; + buf.data = rec->data; + buf.size = rec->data_length; + buf.offset = 0; + buf.error = ERROR_DNS_SUCCESS; - memcpy( pRData + dwOffset, &wnOriginalID, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); + dns_unmarshall_domain_name(tkey, &buf, &tkey->algorithm); + dns_unmarshall_uint32(&buf, &tmp_inception); + dns_unmarshall_uint32(&buf, &tmp_expiration); + dns_unmarshall_uint16(&buf, &tkey->mode); + dns_unmarshall_uint16(&buf, &tkey->error); + dns_unmarshall_uint16(&buf, &tkey->key_length); - memcpy( pRData + dwOffset, &wnError, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); + if (!ERR_DNS_IS_OK(buf.error)) goto error; - memcpy( pRData + dwOffset, &wnOtherLen, sizeof( int16 ) ); - dwOffset += sizeof( int16 ); + if (!(tkey->key = TALLOC_ARRAY(tkey, uint8, tkey->key_length))) { + buf.error = ERROR_DNS_NO_MEMORY; + goto error; + } - pDNSRecord->RRHeader.wRDataSize = ( int16 ) dwRDataSize; + dns_unmarshall_buffer(&buf, tkey->key, tkey->key_length); + if (!ERR_DNS_IS_OK(buf.error)) goto error; - pDNSRecord->pRData = pRData; - *ppDNSRecord = pDNSRecord; + tkey->inception = (time_t)tmp_inception; + tkey->expiration = (time_t)tmp_expiration; - return dwError; + *ptkey = tkey; + return ERROR_DNS_SUCCESS; - error: + error: + TALLOC_FREE(tkey); + return buf.error; +} +DNS_ERROR dns_create_tsig_record(TALLOC_CTX *mem_ctx, const char *keyname, + const char *algorithm_name, + time_t time_signed, uint16 fudge, + uint16 mac_length, const uint8 *mac, + uint16 original_id, uint16 error, + struct dns_rrec **prec) +{ + struct dns_buffer *buf; + struct dns_domain_name *algorithm; + DNS_ERROR err; - if ( pDNSRecord ) { - DNSFreeMemory( pDNSRecord ); + if (!(buf = dns_create_buffer(mem_ctx))) { + return ERROR_DNS_NO_MEMORY; } - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); + err = dns_domain_name_from_string(buf, algorithm_name, &algorithm); + if (!ERR_DNS_IS_OK(err)) goto error; + + dns_marshall_domain_name(buf, algorithm); + dns_marshall_uint16(buf, 0); /* time prefix */ + dns_marshall_uint32(buf, time_signed); + dns_marshall_uint16(buf, fudge); + dns_marshall_uint16(buf, mac_length); + dns_marshall_buffer(buf, mac, mac_length); + dns_marshall_uint16(buf, original_id); + dns_marshall_uint16(buf, error); + dns_marshall_uint16(buf, 0); /* Other Size */ + + if (!ERR_DNS_IS_OK(buf->error)) { + err = buf->error; + goto error; } - if ( pAlgorithmName ) { - DNSFreeDomainName( pAlgorithmName ); - } + err = dns_create_rrec(mem_ctx, keyname, QTYPE_TSIG, DNS_CLASS_ANY, 0, + buf->offset, buf->data, prec); - *ppDNSRecord = NULL; - return dwError; + error: + TALLOC_FREE(buf); + return err; } -/********************************************************************* -*********************************************************************/ - -int32 DNSCreateQuestionRecord( char *pszQName, int16 wQType, - int16 wQClass, - DNS_QUESTION_RECORD ** ppDNSQuestionRecord ) +DNS_ERROR dns_add_rrec(TALLOC_CTX *mem_ctx, struct dns_rrec *rec, + uint16 *num_records, struct dns_rrec ***records) { - int32 dwError = 0; - DNS_QUESTION_RECORD *pDNSQuestionRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - - dwError = DNSDomainNameFromString( pszQName, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSAllocateMemory( sizeof( DNS_QUESTION_RECORD ), - ( void * ) &pDNSQuestionRecord ); - BAIL_ON_ERROR( dwError ); + struct dns_rrec **new_records; - pDNSQuestionRecord->pDomainName = pDomainName; - pDNSQuestionRecord->wQueryClass = wQClass; - pDNSQuestionRecord->wQueryType = wQType; - - *ppDNSQuestionRecord = pDNSQuestionRecord; + if (!(new_records = TALLOC_REALLOC_ARRAY(mem_ctx, *records, + struct dns_rrec *, + (*num_records)+1))) { + return ERROR_DNS_NO_MEMORY; + } - return dwError; - error: + new_records[*num_records] = talloc_move(new_records, &rec); - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); - } - if ( pDNSQuestionRecord ) { - DNSFreeMemory( pDNSQuestionRecord ); - } - *ppDNSQuestionRecord = NULL; - return dwError; + *num_records += 1; + *records = new_records; + return ERROR_DNS_SUCCESS; } -/********************************************************************* -*********************************************************************/ - -int32 DNSCreateZoneRecord( const char *pszZName, DNS_ZONE_RECORD ** ppDNSZoneRecord ) +/* + * Create a request that probes a server whether the list of IP addresses + * provides meets our expectations + */ + +DNS_ERROR dns_create_probe(TALLOC_CTX *mem_ctx, const char *zone, + const char *host, int num_ips, + const struct in_addr *iplist, + struct dns_update_request **preq) { - int32 dwError = 0; - DNS_ZONE_RECORD *pDNSZoneRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; + struct dns_update_request *req; + struct dns_rrec *rec; + DNS_ERROR err; + uint16 i; - dwError = DNSDomainNameFromString( pszZName, &pDomainName ); - BAIL_ON_ERROR( dwError ); + err = dns_create_update(mem_ctx, zone, &req); + if (!ERR_DNS_IS_OK(err)) goto error; - dwError = - DNSAllocateMemory( sizeof( DNS_ZONE_RECORD ), - ( void * ) &pDNSZoneRecord ); - BAIL_ON_ERROR( dwError ); + err = dns_create_name_not_in_use_record(req, host, QTYPE_CNAME, &rec); + if (!ERR_DNS_IS_OK(err)) goto error; - pDNSZoneRecord->pDomainName = pDomainName; - pDNSZoneRecord->wZoneClass = DNS_CLASS_IN; - pDNSZoneRecord->wZoneType = QTYPE_SOA; + err = dns_add_rrec(req, rec, &req->num_preqs, &req->preqs); + if (!ERR_DNS_IS_OK(err)) goto error; - *ppDNSZoneRecord = pDNSZoneRecord; + for (i=0; inum_preqs, &req->preqs); + if (!ERR_DNS_IS_OK(err)) goto error; } - *ppDNSZoneRecord = NULL; - return dwError; -} -int32 DNSFreeZoneRecord( DNS_ZONE_RECORD * pDNSZoneRecord ) -{ - int32 dwError = 0; - - return dwError; + *preq = req; + return ERROR_DNS_SUCCESS; + error: + TALLOC_FREE(req); + return err; } - -/********************************************************************* -*********************************************************************/ - -int32 DNSCreateNameInUseRecord( char *pszName, int32 qtype, - struct in_addr * ip, - DNS_RR_RECORD * *ppDNSRRRecord ) + +DNS_ERROR dns_create_update_request(TALLOC_CTX *mem_ctx, + const char *domainname, + const char *hostname, + in_addr_t ip_addr, + struct dns_update_request **preq) { - int32 dwError = 0; - DNS_RR_RECORD *pDNSRRRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; - - dwError = DNSDomainNameFromString( pszName, &pDomainName ); - BAIL_ON_ERROR( dwError ); - - dwError = - DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRRRecord ); - BAIL_ON_ERROR( dwError ); - - pDNSRRRecord->RRHeader.pDomainName = pDomainName; - pDNSRRRecord->RRHeader.dwTTL = 0; - pDNSRRRecord->RRHeader.wType = qtype; - - if ( !ip ) { - pDNSRRRecord->RRHeader.wClass = DNS_CLASS_ANY; - pDNSRRRecord->RRHeader.wRDataSize = 0; - } else { - pDNSRRRecord->RRHeader.wClass = DNS_CLASS_IN; - pDNSRRRecord->RRHeader.wRDataSize = 4; - dwError = - DNSAllocateMemory( 4, - ( void * ) &pDNSRRRecord-> - pRData ); - BAIL_ON_ERROR( dwError ); - memcpy( pDNSRRRecord->pRData, &ip->s_addr, 4 ); - } + struct dns_update_request *req; + struct dns_rrec *rec; + DNS_ERROR err; - *ppDNSRRRecord = pDNSRRRecord; + err = dns_create_update(mem_ctx, domainname, &req); + if (!ERR_DNS_IS_OK(err)) return err; - return dwError; - error: + /* + * The zone must be used at all + */ - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); - } - if ( pDNSRRRecord ) { - DNSFreeMemory( pDNSRRRecord ); - } - *ppDNSRRRecord = NULL; + err = dns_create_rrec(req, domainname, QTYPE_ANY, DNS_CLASS_ANY, + 0, 0, NULL, &rec); + if (!ERR_DNS_IS_OK(err)) goto error; - return dwError; -} + err = dns_add_rrec(req, rec, &req->num_preqs, &req->preqs); + if (!ERR_DNS_IS_OK(err)) goto error; -/********************************************************************* -*********************************************************************/ + /* + * Delete any existing A records + */ -int32 DNSCreateNameNotInUseRecord( char *pszName, int32 qtype, - DNS_RR_RECORD * *ppDNSRRRecord ) -{ - int32 dwError = 0; - DNS_RR_RECORD *pDNSRRRecord = NULL; - DNS_DOMAIN_NAME *pDomainName = NULL; + err = dns_create_delete_record(req, hostname, QTYPE_A, DNS_CLASS_ANY, + &rec); + if (!ERR_DNS_IS_OK(err)) goto error; + + err = dns_add_rrec(req, rec, &req->num_updates, &req->updates); + if (!ERR_DNS_IS_OK(err)) goto error; - dwError = DNSDomainNameFromString( pszName, &pDomainName ); - BAIL_ON_ERROR( dwError ); + /* + * .. and add our IP + */ - dwError = - DNSAllocateMemory( sizeof( DNS_RR_RECORD ), - ( void * ) &pDNSRRRecord ); - BAIL_ON_ERROR( dwError ); + err = dns_create_a_record(req, hostname, 3600, ip_addr, &rec); + if (!ERR_DNS_IS_OK(err)) goto error; - pDNSRRRecord->RRHeader.pDomainName = pDomainName; - pDNSRRRecord->RRHeader.wClass = DNS_CLASS_NONE; - pDNSRRRecord->RRHeader.wType = qtype; - pDNSRRRecord->RRHeader.dwTTL = 0; - pDNSRRRecord->RRHeader.wRDataSize = 0; + err = dns_add_rrec(req, rec, &req->num_updates, &req->updates); + if (!ERR_DNS_IS_OK(err)) goto error; - *ppDNSRRRecord = pDNSRRRecord; - - return dwError; - error: - - if ( pDomainName ) { - DNSFreeDomainName( pDomainName ); - } - if ( pDNSRRRecord ) { - DNSFreeMemory( pDNSRRRecord ); - } - *ppDNSRRRecord = NULL; - return dwError; + *preq = req; + return ERROR_DNS_SUCCESS; + error: + TALLOC_FREE(req); + return err; } - -- cgit