r26648: Move detection of global catalog captability to a central function, so
authorAndrew Bartlett <abartlet@samba.org>
Thu, 3 Jan 2008 10:40:24 +0000 (04:40 -0600)
committerStefan Metzmacher <metze@samba.org>
Thu, 3 Jan 2008 18:33:35 +0000 (12:33 -0600)
this can be shared with the CLDAP server (for the netlogon reply).

Andrew Bartlett
(This used to be commit 592c10ae11c94007e38404a7edea9fd8471f1907)

source4/dsdb/common/util.c
source4/ldap_server/ldap_server.c

index 345f13fcbcce94912d6b9015e25e6a7349af682d..17a20199d51473b2dc8e5a1c1a2f5f819a44d909 100644 (file)
@@ -1367,6 +1367,42 @@ failed:
        return false;
 }
 
+/*
+  work out if we are a Global Catalog server for the domain of the current open ldb
+*/
+bool samdb_is_gc(struct ldb_context *ldb)
+{
+       const char *attrs[] = { "options", NULL };
+       int ret, options;
+       struct ldb_result *res;
+       TALLOC_CTX *tmp_ctx;
+
+       tmp_ctx = talloc_new(ldb);
+       if (tmp_ctx == NULL) {
+               DEBUG(1, ("talloc_new failed in samdb_is_pdc"));
+               return false;
+       }
+
+       /* Query cn=ntds settings,.... */
+       ret = ldb_search(ldb, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, NULL, attrs, &res);
+       if (ret) {
+               return false;
+       }
+       if (res->count != 1) {
+               talloc_free(res);
+               return false;
+       }
+
+       options = ldb_msg_find_attr_as_int(res->msgs[0], "options", 0);
+       talloc_free(res);
+       talloc_free(ldb);
+
+       /* if options attribute has the 0x00000001 flag set, then enable the global catlog */
+       if (options & 0x000000001) {
+               return true;
+       }
+       return false;
+}
 
 /* Find a domain object in the parents of a particular DN.  */
 int samdb_search_for_parent_domain(struct ldb_context *ldb, TALLOC_CTX *mem_ctx, struct ldb_dn *dn,
index a2521ca40696847461d3cb8dad755254c2845949..9bb1279a995162c3071454ee163c9294a6777a24 100644 (file)
@@ -447,11 +447,7 @@ static NTSTATUS add_socket(struct event_context *event_context,
 {
        uint16_t port = 389;
        NTSTATUS status;
-       const char *attrs[] = { "options", NULL };
-       int ret;
-       struct ldb_result *res;
        struct ldb_context *ldb;
-       int options;
 
        status = stream_setup_socket(event_context, model_ops, &ldap_stream_ops, 
                                     "ipv4", address, &port, 
@@ -481,22 +477,7 @@ static NTSTATUS add_socket(struct event_context *event_context,
                return NT_STATUS_INTERNAL_DB_CORRUPTION;
        }
        
-       /* Query cn=ntds settings,.... */
-       ret = ldb_search(ldb, samdb_ntds_settings_dn(ldb), LDB_SCOPE_BASE, NULL, attrs, &res);
-       if (ret) {
-               return NT_STATUS_INTERNAL_DB_CORRUPTION;
-       }
-       if (res->count != 1) {
-               talloc_free(res);
-               return NT_STATUS_NOT_FOUND;
-       }
-
-       options = ldb_msg_find_attr_as_int(res->msgs[0], "options", 0);
-       talloc_free(res);
-       talloc_free(ldb);
-
-       /* if options attribute has the 0x00000001 flag set, then enable the global catlog */
-       if (options & 0x000000001) {
+       if (samdb_is_gc(ldb)) {
                port = 3268;
                status = stream_setup_socket(event_context, model_ops, &ldap_stream_ops, 
                                             "ipv4", address, &port,