s4:rpc-dnsserver: If a zone is reverse zone, set the fReverse flag
authorAmitay Isaacs <amitay@gmail.com>
Wed, 14 Dec 2011 05:17:31 +0000 (16:17 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Fri, 23 Dec 2011 05:17:09 +0000 (16:17 +1100)
And use fReverse flag in the enumeration of zones.

source4/rpc_server/dnsserver/dcerpc_dnsserver.c
source4/rpc_server/dnsserver/dnsutils.c

index e1966fa6fc8037ff8d81511a398e4727c1d3abae..98e935ca991ee3b8791014489806bbf996333680 100644 (file)
@@ -1165,12 +1165,12 @@ static WERROR dnsserver_complex_operate_server(struct dnsserver_state *dsstate,
                        found2 = false;
                        if (rin->Dword & 0x000000f0) {
                                if (rin->Dword & DNS_ZONE_REQUEST_FORWARD) {
-                                       if (!(z->zoneinfo->Flags & DNS_RPC_ZONE_REVERSE)) {
+                                       if (!(z->zoneinfo->fReverse)) {
                                                found2 = true;
                                        }
                                }
                                if (rin->Dword & DNS_ZONE_REQUEST_REVERSE) {
-                                       if (z->zoneinfo->Flags & DNS_RPC_ZONE_REVERSE) {
+                                       if (z->zoneinfo->fReverse) {
                                                found2 = true;
                                        }
                                }
index 1f5edae2da3401d6c8ee738e262acf584e66576f..3ae47a8c5fb125a3458e1465150ee6015d659e2f 100644 (file)
@@ -159,6 +159,9 @@ struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
 {
        struct dnsserver_zoneinfo *zoneinfo;
        uint32_t dp_flags;
+       uint32_t fReverse;
+       const char *revzone = "in-addr.arpa";
+       int len1, len2;
 
        zoneinfo = talloc_zero(zone, struct dnsserver_zoneinfo);
        if (zoneinfo == NULL) {
@@ -172,10 +175,18 @@ struct dnsserver_zoneinfo *dnsserver_init_zoneinfo(struct dnsserver_zone *zone,
                dp_flags |= DNS_DP_DOMAIN_DEFAULT;
        }
 
+       /* If the zone name ends with in-addr.arpa, it's reverse zone */
+       fReverse = 0;
+       len1 = strlen(zone->name);
+       len2 = strlen(revzone);
+       if (len1 > len2 && strcmp(&zone->name[len1-len2], revzone) == 0) {
+               fReverse = 1;
+       }
+
        zoneinfo->Version = 0x32;
        zoneinfo->Flags = DNS_RPC_ZONE_DSINTEGRATED | DNS_RPC_ZONE_UPDATE_SECURE;
        zoneinfo->dwZoneType = DNS_ZONE_TYPE_PRIMARY;
-       zoneinfo->fReverse = 0; /* We only support forward zones for now */
+       zoneinfo->fReverse = fReverse;
        zoneinfo->fAllowUpdate = DNS_ZONE_UPDATE_SECURE;
        zoneinfo->fPaused = 0;
        zoneinfo->fShutdown = 0;