summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--librpc/idl/dnsp.idl32
-rw-r--r--source4/dns_server/dlz_bind9.c13
2 files changed, 34 insertions, 11 deletions
diff --git a/librpc/idl/dnsp.idl b/librpc/idl/dnsp.idl
index eed0c478fb..495a3e2af2 100644
--- a/librpc/idl/dnsp.idl
+++ b/librpc/idl/dnsp.idl
@@ -23,7 +23,7 @@ import "misc.idl";
interface dnsp
{
- typedef enum {
+ typedef [enum16bit] enum {
DNS_TYPE_ZERO = 0x0,
DNS_TYPE_A = 0x1,
DNS_TYPE_NS = 0x2,
@@ -65,6 +65,22 @@ interface dnsp
DNS_TYPE_WINSR = 0xFF02
} dns_record_type;
+ typedef [enum8bit] enum {
+ DNS_RANK_NONE = 0x00,
+ DNS_RANK_CACHE_BIT = 0x01,
+ DNS_RANK_ROOT_HINT = 0x08,
+ DNS_RANK_OUTSIDE_GLUE = 0x20,
+ DNS_RANK_CACHE_NA_ADDITIONAL = 0x31,
+ DNS_RANK_CACHE_NA_AUTHORITY = 0x41,
+ DNS_RANK_CACHE_A_ADDITIONAL = 0x51,
+ DNS_RANK_CACHE_NA_ANSWER = 0x61,
+ DNS_RANK_CACHE_A_AUTHORITY = 0x71,
+ DNS_RANK_GLUE = 0x80,
+ DNS_RANK_NS_GLUE = 0x82,
+ DNS_RANK_CACHE_A_ANSWER = 0xc1,
+ DNS_RANK_ZONE = 0xf0
+ } dns_record_rank;
+
typedef [public] struct {
uint32 serial;
uint32 refresh;
@@ -110,12 +126,14 @@ interface dnsp
partitions in AD */
typedef [public] struct {
[value(ndr_size_dnsRecordData(&data,wType,ndr->flags))] uint16 wDataLength;
- dns_record_type wType;
- uint32 dwFlags;
- uint32 dwSerial;
- [flag(NDR_BIG_ENDIAN)] uint32 dwTtlSeconds;
- uint32 dwTimeStamp;
- uint32 dwReserved;
+ dns_record_type wType;
+ [value(5)] uint8 version;
+ dns_record_rank rank;
+ uint16 flags;
+ uint32 dwSerial;
+ [flag(NDR_BIG_ENDIAN)] uint32 dwTtlSeconds;
+ uint32 dwReserved;
+ uint32 dwTimeStamp;
[switch_is(wType)] dnsRecordData data;
} dnsp_DnssrvRpcRecord;
diff --git a/source4/dns_server/dlz_bind9.c b/source4/dns_server/dlz_bind9.c
index 83790c8da0..7f5125dbf6 100644
--- a/source4/dns_server/dlz_bind9.c
+++ b/source4/dns_server/dlz_bind9.c
@@ -150,7 +150,7 @@ static bool b9_format(struct dlz_bind9_data *state,
*type = "soa";
/* we need to fake the authoritative nameserver to
- * point at ourselves. This is now AD DNS servers
+ * point at ourselves. This is how AD DNS servers
* force clients to send updates to the right local DC
*/
mname = talloc_asprintf(mem_ctx, "%s.%s",
@@ -1179,6 +1179,7 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
int ret, i;
struct ldb_message_element *el;
enum ndr_err_code ndr_err;
+ NTTIME t;
if (state->transaction_token != (void*)version) {
state->log(ISC_LOG_INFO, "samba_dlz: bad transaction version");
@@ -1190,9 +1191,13 @@ _PUBLIC_ isc_result_t dlz_addrdataset(const char *name, const char *rdatastr, vo
return ISC_R_NOMEMORY;
}
- /* we're waiting on docs for this field */
- rec->dwFlags = 0x0000f005;
- rec->dwSerial = state->soa_serial;
+ unix_to_nt_time(&t, time(NULL));
+ t /= 10*1000*1000; /* convert to seconds (NT time is in 100ns units) */
+ t /= 3600; /* convert to hours */
+
+ rec->rank = DNS_RANK_ZONE;
+ rec->dwSerial = state->soa_serial;
+ rec->dwTimeStamp = (uint32_t)t;
if (!b9_parse(state, rdatastr, rec)) {
state->log(ISC_LOG_INFO, "samba_dlz: failed to parse rdataset '%s'", rdatastr);