summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2008-01-03 04:40:24 -0600
committerStefan Metzmacher <metze@samba.org>2008-01-03 12:33:35 -0600
commit636c9a7c719ef24205c40b8e2018d83040520490 (patch)
tree0ec0ac52a5c12b9b865b47d10f60cf1ea7c6f915 /source4
parentbcdc491058d8b9ca890a9bdc0635d839d41e8fd8 (diff)
downloadsamba-636c9a7c719ef24205c40b8e2018d83040520490.tar.gz
samba-636c9a7c719ef24205c40b8e2018d83040520490.tar.bz2
samba-636c9a7c719ef24205c40b8e2018d83040520490.zip
r26648: Move detection of global catalog captability to a central function, so
this can be shared with the CLDAP server (for the netlogon reply). Andrew Bartlett (This used to be commit 592c10ae11c94007e38404a7edea9fd8471f1907)
Diffstat (limited to 'source4')
-rw-r--r--source4/dsdb/common/util.c36
-rw-r--r--source4/ldap_server/ldap_server.c21
2 files changed, 37 insertions, 20 deletions
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 345f13fcbc..17a20199d5 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -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,
diff --git a/source4/ldap_server/ldap_server.c b/source4/ldap_server/ldap_server.c
index a2521ca406..9bb1279a99 100644
--- a/source4/ldap_server/ldap_server.c
+++ b/source4/ldap_server/ldap_server.c
@@ -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,