[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Jun 15 17:58:17 MDT 2010


The branch, master has been updated
       via  0687a0c... s4:selftest Change domain name for functional level 2000 DC
       via  35237d5... s4:libnet Remove 'ads min function level' checks.
       via  25abcb6... s4:dsdb Fix linked_attributes to cope with the Feb 2010 changes to DLIST
       via  5150f85... s4:dsdb Assert that we can't get backlinks as input in linked_attributes
       via  f9018bc... s4:selftest Add test environment for functional level 2000
       via  d523e94... s4:provision Add import for DS_DOMAIN_FUNCTION_2000
       via  814cb88... s4:provision Allow functional level 2000 to be chosen
       via  697cd13... s4:selftest Add vampire_dc test environment
       via  ec6839a... s4:dsdb use dsdb_module_modify() rather than ldb_next_request()
       via  ffa7877... s4:dsdb Handle backlinks for Windows 2000 level linked attributes
       via  ecfce73... s4:dsdb Add control for signaling between repl_meta_data and linked_attributes
      from  81f7083... Remove unused function.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0687a0c9dc3804e34a64f64f064fbbadb3e72ad5
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Wed Jun 16 09:16:05 2010 +1000

    s4:selftest Change domain name for functional level 2000 DC

commit 35237d5356d50be16963b9561b17b045cd2c2999
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 23:01:51 2010 +1000

    s4:libnet Remove 'ads min function level' checks.
    
    We support Windows 2000 native now.
    
    Andrew Bartlett

commit 25abcb68185ed21ecf030ee6b081e2c912a687f5
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 22:57:14 2010 +1000

    s4:dsdb Fix linked_attributes to cope with the Feb 2010 changes to DLIST
    
    The DLIST macros changed in behaviour in Feb 2010, and walking the
    lists backwards is no longer safe if you don't use the macros.
    
    Andrew Bartlett

commit 5150f8597a2211414ddbd588e8bd64e0ef3c29a7
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 22:26:22 2010 +1000

    s4:dsdb Assert that we can't get backlinks as input in linked_attributes
    
    The objectclass_attr module should prevent users creating such links,
    and the mrepl_meta_data module should only create them in functional
    level 2003 or above.
    
    Andrew Bartlett

commit f9018bc0ea882bf9303350ca594262c88942c38f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 22:24:36 2010 +1000

    s4:selftest Add test environment for functional level 2000
    
    This required that we pass the name of the realm down as a parameter,
    so we can start up two different realms.
    
    Andrew Bartlett

commit d523e946b189826bd0ada2297ba6bdf7d6e73947
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 20:45:25 2010 +1000

    s4:provision Add import for DS_DOMAIN_FUNCTION_2000

commit 814cb8895db8fbb39761ce5b2e581cb8cec9f77f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jun 15 19:52:58 2010 +1000

    s4:provision Allow functional level 2000 to be chosen

commit 697cd139782a8337c1979442fc5d5705e748aa3f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Mar 12 10:36:12 2010 +1100

    s4:selftest Add vampire_dc test environment
    
    This starts a domain controller, after running 'net vampire' to
    populate it.  We don't use it as the 'all' environment yet, as the
    rest of the code isn't quite ready to handle it.
    
    Andrew Bartlett

commit ec6839ac26ee54c501e3377d446cf9884175034e
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jun 14 15:50:13 2010 +1000

    s4:dsdb use dsdb_module_modify() rather than ldb_next_request()
    
    This does exactly the same thing, but with less code.
    
    Andrew Bartlett

commit ffa787772fe6b88a846209e1733d004d80c99afc
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sun Jun 13 15:54:23 2010 +1000

    s4:dsdb Handle backlinks for Windows 2000 level linked attributes
    
    This revives the code from 5964acfa741d691c0196f91c0796122ec025f177,
    before tridge and I simplified this too much, and removed the Windows
    2000 functional level linked attribute support.
    
    By telling the linked_attributes module that repl_meta_data has
    handled the links, we avoid a conflict for the new style (functional
    level 2003 and above) linked attributes.  However, we still need
    backlinks for 2000 style linked attributes, so this allows that code
    in the linked_attributes module to be revived to handle those.
    
    Andrew Bartlett

commit ecfce7365c8d3fffc5b8eeda13b18e2605ff7b02
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jun 14 15:30:36 2010 +1000

    s4:dsdb Add control for signaling between repl_meta_data and linked_attributes
    
    This control will allow the linked_attributes module to know if
    repl_meta_data has already handled the creation of forward and back
    links.
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 selftest/selftest.pl                               |   10 +-
 selftest/target/Samba4.pm                          |  162 ++++-
 source4/dsdb/common/util.h                         |    1 +
 source4/dsdb/samdb/ldb_modules/linked_attributes.c |  890 +++++++++++++++++++-
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c    |   47 +-
 source4/dsdb/samdb/samdb.h                         |    5 +
 source4/libnet/libnet_become_dc.c                  |   23 -
 source4/selftest/tests.sh                          |    2 +
 source4/setup/provision                            |    5 +-
 source4/setup/schema_samba4.ldif                   |    1 +
 10 files changed, 1099 insertions(+), 47 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/selftest.pl b/selftest/selftest.pl
index 6ec429b..668afbe 100755
--- a/selftest/selftest.pl
+++ b/selftest/selftest.pl
@@ -767,18 +767,24 @@ my @exported_envvars = (
 	"DC_NETBIOSNAME",
 	"DC_NETBIOSALIAS",
 
-	# domain controller stuff
+	# domain member
 	"MEMBER_SERVER",
 	"MEMBER_SERVER_IP",
 	"MEMBER_NETBIOSNAME",
 	"MEMBER_NETBIOSALIAS",
 
-	# domain controller stuff
+	# rpc proxy controller stuff
 	"RPC_PROXY_SERVER",
 	"RPC_PROXY_SERVER_IP",
 	"RPC_PROXY_NETBIOSNAME",
 	"RPC_PROXY_NETBIOSALIAS",
 
+	# domain controller stuff for Vampired DC
+	"VAMPIRE_DC_SERVER",
+	"VAMPIRE_DC_SERVER_IP",
+	"VAMPIRE_DC_NETBIOSNAME",
+	"VAMPIRE_DC_NETBIOSALIAS",
+
 	# server stuff
 	"SERVER",
 	"SERVER_IP",
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 343834c..c8dbf8a 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -443,9 +443,11 @@ EOF
 #
 # provision_raw_prepare() is also used by Samba34.pm!
 #
-sub provision_raw_prepare($$$$$$$)
+sub provision_raw_prepare($$$$$$$$$$)
 {
-	my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, $swiface, $password, $kdc_ipv4) = @_;
+	my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, 
+	    $domain, $realm, $functional_level,
+	    $swiface, $password, $kdc_ipv4) = @_;
 	my $ctx;
 
 	-d $prefix or mkdir($prefix, 0777) or die("Unable to create $prefix");
@@ -470,11 +472,13 @@ sub provision_raw_prepare($$$$$$$)
 
 	$ctx->{server_loglevel} = 1;
 	$ctx->{username} = "Administrator";
-	$ctx->{domain} = "SAMBADOMAIN";
-	$ctx->{realm} = "SAMBA.EXAMPLE.COM";
-	$ctx->{dnsname} = lc($ctx->{realm});
+	$ctx->{domain} = $domain;
+	$ctx->{realm} = uc($realm);
+	$ctx->{dnsname} = lc($realm);
 	$ctx->{sid_generator} = "internal";
 
+	$ctx->{functional_level} = $functional_level;
+
 	my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `whoami`);
 	chomp $unix_name;
 	$ctx->{unix_name} = $unix_name;
@@ -532,6 +536,7 @@ sub provision_raw_prepare($$$$$$$)
 	push (@provision_options, "--machinepass=machine$ctx->{password}");
 	push (@provision_options, "--root=$ctx->{unix_name}");
 	push (@provision_options, "--server-role=\"$ctx->{server_role}\"");
+	push (@provision_options, "--function-level=\"$ctx->{functional_level}\"");
 
 	@{$ctx->{provision_options}} = @provision_options;
 
@@ -716,12 +721,15 @@ sub provision_raw_step2($$$)
 	return $ret;
 }
 
-sub provision($$$$$$$)
+sub provision($$$$$$$$$)
 {
-	my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, $swiface, $password, $kdc_ipv4, $extra_smbconf_options) = @_;
+	my ($self, $prefix, $server_role, $netbiosname, $netbiosalias, 
+	    $domain, $realm, $functional_level, 
+	    $swiface, $password, $kdc_ipv4, $extra_smbconf_options) = @_;
 
 	my $ctx = $self->provision_raw_prepare($prefix, $server_role,
 					       $netbiosname, $netbiosalias,
+					       $domain, $realm, $functional_level,
 					       $swiface, $password, $kdc_ipv4);
 
 	$ctx->{tmpdir} = "$ctx->{prefix_abs}/tmp";
@@ -832,6 +840,9 @@ sub provision_member($$$)
 				   "member server",
 				   "localmember3",
 				   "localmember",
+				   "SAMBADOMAIN", 
+				   "samba.example.com", 
+				   "2008",
 				   3,
 				   "locMEMpass0",
 				   $dcvars->{SERVER_IP},
@@ -879,6 +890,9 @@ sub provision_rpc_proxy($$$)
 				   "member server",
 				   "localrpcproxy4",
 				   "localrpcproxy",
+				   "SAMBADOMAIN", 
+				   "samba.example.com", 
+				   "2008",
 				   4,
 				   "locRPCproxypass0",
 				   $dcvars->{SERVER_IP},
@@ -905,6 +919,62 @@ sub provision_rpc_proxy($$$)
 	return $ret;
 }
 
+sub provision_vampire_dc($$$)
+{
+	my ($self, $prefix, $dcvars) = @_;
+	print "PROVISIONING VAMPIRE DC...";
+
+	# We do this so that we don't run the provision.  That's the job of 'net vampire'.
+	my $ctx = $self->provision_raw_prepare($prefix, "domain controller",
+					       "localvampiredc", "localvampiredc5", 				   
+					       "SAMBADOMAIN", 
+					       "samba.example.com", 
+					       "2008",
+					       5, $dcvars->{PASSWORD},
+					       $dcvars->{SERVER_IP});
+
+	$ctx->{smb_conf_extra_options} = "
+	max xmit = 32K
+	server max protocol = SMB2
+
+[sysvol]
+	path = $ctx->{lockdir}/sysvol
+	read only = yes
+
+[netlogon]
+	path = $ctx->{lockdir}/sysvol/$ctx->{dnsname}/scripts
+	read only = no
+
+";
+
+	my $ret = $self->provision_raw_step1($ctx);
+
+	$ret or die("Unable to prepare test env");
+
+	my $net = $self->bindir_path("net");
+	my $cmd = "";
+	$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$ret->{SOCKET_WRAPPER_DEFAULT_IFACE}\" ";
+	$cmd .= "KRB5_CONFIG=\"$ret->{KRB5_CONFIG}\" ";
+	$cmd .= "$net vampire $ret->{CONFIGURATION} $dcvars->{DOMAIN} --realm=$dcvars->{REALM}";
+	$cmd .= " -U$dcvars->{DC_USERNAME}\%$dcvars->{DC_PASSWORD}";
+
+	system($cmd) == 0 or die("Join failed\n$cmd");
+
+	$ret->{VAMPIRE_DC_SERVER} = $ret->{SERVER};
+	$ret->{VAMPIRE_DC_SERVER_IP} = $ret->{SERVER_IP};
+	$ret->{VAMPIRE_DC_NETBIOSNAME} = $ret->{NETBIOSNAME};
+	$ret->{VAMPIRE_DC_NETBIOSALIAS} = $ret->{NETBIOSALIAS};
+
+	$ret->{DC_SERVER} = $dcvars->{DC_SERVER};
+	$ret->{DC_SERVER_IP} = $dcvars->{DC_SERVER_IP};
+	$ret->{DC_NETBIOSNAME} = $dcvars->{DC_NETBIOSNAME};
+	$ret->{DC_NETBIOSALIAS} = $dcvars->{DC_NETBIOSALIAS};
+	$ret->{DC_USERNAME} = $dcvars->{DC_USERNAME};
+	$ret->{DC_PASSWORD} = $dcvars->{DC_PASSWORD};
+
+	return $ret;
+}
+
 sub provision_dc($$)
 {
 	my ($self, $prefix) = @_;
@@ -914,6 +984,9 @@ sub provision_dc($$)
 				   "domain controller",
 				   "localdc1",
 				   "localdc",
+				   "SAMBADOMAIN", 
+				   "samba.example.com", 
+				   "2008",
 				   1,
 				   "locDCpass0",
 				   "127.0.0.1", "");
@@ -931,6 +1004,28 @@ sub provision_dc($$)
 	return $ret;
 }
 
+sub provision_fl2000dc($$)
+{
+	my ($self, $prefix) = @_;
+
+	print "PROVISIONING DC...";
+	my $ret = $self->provision($prefix,
+				   "domain controller",
+				   "localfl2000dc1",
+				   "localfl2000dc",
+				   "SAMBA2000", 
+				   "samba2000.example.com", 
+				   "2000",
+				   7,
+				   "locDCpass0",
+				   "127.0.0.7", "");
+
+	$self->add_wins_config("$prefix/private") or 
+		die("Unable to add wins configuration");
+
+	return $ret;
+}
+
 sub teardown_env($$)
 {
 	my ($self, $envvars) = @_;
@@ -1006,11 +1101,18 @@ sub setup_env($$$)
 
 	if ($envname eq "dc") {
 		return $self->setup_dc("$path/dc");
+	} elsif ($envname eq "fl2000dc") {
+		return $self->setup_fl2000dc("$path/fl2000dc");
 	} elsif ($envname eq "rpc_proxy") {
 		if (not defined($self->{vars}->{dc})) {
 			$self->setup_dc("$path/dc");
 		}
 		return $self->setup_rpc_proxy("$path/rpc_proxy", $self->{vars}->{dc});
+	} elsif ($envname eq "vampire_dc") {
+		if (not defined($self->{vars}->{dc})) {
+			$self->setup_dc("$path/dc");
+		}
+		return $self->setup_vampire_dc("$path/vampire_dc", $self->{vars}->{dc});
 	} elsif ($envname eq "member") {
 		if (not defined($self->{vars}->{dc})) {
 			$self->setup_dc("$path/dc");
@@ -1031,13 +1133,23 @@ sub setup_env($$$)
 			$ret->{RPC_PROXY_USERNAME} = $rpc_proxy_ret->{USERNAME};
 			$ret->{RPC_PROXY_PASSWORD} = $rpc_proxy_ret->{PASSWORD};
 		}
+		if (not defined($self->{vars}->{fl2000dc})) {
+			my $fl2000dc_ret = $self->setup_fl2000dc("$path/fl2000dc", $self->{vars}->{dc});
+			
+			$ret->{FL2000DC_SERVER} = $fl2000dc_ret->{SERVER};
+			$ret->{FL2000DC_SERVER_IP} = $fl2000dc_ret->{SERVER_IP};
+			$ret->{FL2000DC_NETBIOSNAME} = $fl2000dc_ret->{NETBIOSNAME};
+			$ret->{FL2000DC_NETBIOSALIAS} = $fl2000dc_ret->{NETBIOSALIAS};
+			$ret->{FL2000DC_USERNAME} = $fl2000dc_ret->{USERNAME};
+			$ret->{FL2000DC_PASSWORD} = $fl2000dc_ret->{PASSWORD};
+		}
 		return $ret;
 	} else {
 		die("Samba4 can't provide environment '$envname'");
 	}
 }
 
-sub setup_member($$$$)
+sub setup_member($$$)
 {
 	my ($self, $path, $dc_vars) = @_;
 
@@ -1052,7 +1164,7 @@ sub setup_member($$$$)
 	return $env;
 }
 
-sub setup_rpc_proxy($$$$)
+sub setup_rpc_proxy($$$)
 {
 	my ($self, $path, $dc_vars) = @_;
 
@@ -1083,6 +1195,38 @@ sub setup_dc($$)
 	return $env;
 }
 
+sub setup_fl2000dc($$)
+{
+	my ($self, $path) = @_;
+
+	my $env = $self->provision_fl2000dc($path);
+
+	$self->check_or_start($env, 
+		($ENV{SMBD_MAXTIME} or 7500));
+
+	$self->wait_for_start($env);
+
+	$self->{vars}->{fl2000dc} = $env;
+
+	return $env;
+}
+
+sub setup_vampire_dc($$$)
+{
+	my ($self, $path, $dc_vars) = @_;
+
+	my $env = $self->provision_vampire_dc($path, $dc_vars);
+
+	$self->check_or_start($env,
+		($ENV{SMBD_MAXTIME} or 7500));
+
+	$self->wait_for_start($env);
+
+	$self->{vars}->{vampire_dc} = $env;
+
+	return $env;
+}
+
 sub stop($)
 {
 	my ($self) = @_;
diff --git a/source4/dsdb/common/util.h b/source4/dsdb/common/util.h
index 53ffdc4..0b6ef3d 100644
--- a/source4/dsdb/common/util.h
+++ b/source4/dsdb/common/util.h
@@ -31,4 +31,5 @@
 #define DSDB_MODIFY_RELAX		      0x0020
 #define DSDB_MODIFY_PERMISSIVE		      0x0040
 #define DSDB_FLAG_AS_SYSTEM		      0x0080
+
 #define DSDB_SEARCH_ONE_ONLY		      0x0020 /* give an error unless 1 record */
diff --git a/source4/dsdb/samdb/ldb_modules/linked_attributes.c b/source4/dsdb/samdb/ldb_modules/linked_attributes.c
index 876ada6..d2a435e 100644
--- a/source4/dsdb/samdb/ldb_modules/linked_attributes.c
+++ b/source4/dsdb/samdb/ldb_modules/linked_attributes.c
@@ -35,6 +35,561 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "dsdb/samdb/ldb_modules/util.h"
 
+struct la_private {
+	struct la_context *la_list;
+};
+
+struct la_op_store {
+	struct la_op_store *next;
+	struct la_op_store *prev;
+	enum la_op {LA_OP_ADD, LA_OP_DEL} op;
+	struct GUID guid;
+	char *name;
+	char *value;
+};
+
+struct replace_context {
+	struct la_context *ac;
+	unsigned int num_elements;
+	struct ldb_message_element *el;
+};
+
+struct la_context {
+	struct la_context *next, *prev;
+	const struct dsdb_schema *schema;
+	struct ldb_module *module;
+	struct ldb_request *req;
+	struct ldb_dn *add_dn;
+	struct ldb_dn *del_dn;
+	struct replace_context *rc;
+	struct la_op_store *ops;
+	struct ldb_extended *op_response;
+	struct ldb_control **op_controls;
+};
+
+static struct la_context *linked_attributes_init(struct ldb_module *module,
+						 struct ldb_request *req)
+{
+	struct ldb_context *ldb;
+	struct la_context *ac;
+
+	ldb = ldb_module_get_ctx(module);
+
+	ac = talloc_zero(req, struct la_context);
+	if (ac == NULL) {
+		ldb_oom(ldb);
+		return NULL;
+	}
+
+	ac->schema = dsdb_get_schema(ldb, ac);
+	ac->module = module;
+	ac->req = req;
+
+	return ac;
+}
+
+/*
+  turn a DN into a GUID
+ */
+static int la_guid_from_dn(struct la_context *ac, struct ldb_dn *dn, struct GUID *guid)
+{
+	int ret;
+	NTSTATUS status;
+
+	status = dsdb_get_extended_dn_guid(dn, guid, "GUID");
+	if (NT_STATUS_IS_OK(status)) {
+		return LDB_SUCCESS;
+	}
+	if (!NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
+		DEBUG(4,(__location__ ": Unable to parse GUID for dn %s\n",
+			 ldb_dn_get_linearized(dn)));
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	ret = dsdb_find_guid_by_dn(ldb_module_get_ctx(ac->module), dn, guid);
+	if (ret != LDB_SUCCESS) {
+		DEBUG(4,(__location__ ": Failed to find GUID for dn %s\n",
+			 ldb_dn_get_linearized(dn)));
+		return ret;
+	}
+	return LDB_SUCCESS;
+}
+
+
+/* Common routine to handle reading the attributes and creating a
+ * series of modify requests */
+static int la_store_op(struct la_context *ac,
+		       enum la_op op, struct ldb_val *dn,
+		       const char *name)
+{
+	struct ldb_context *ldb;
+	struct la_op_store *os;
+	struct ldb_dn *op_dn;
+	int ret;
+
+	ldb = ldb_module_get_ctx(ac->module);
+
+	op_dn = ldb_dn_from_ldb_val(ac, ldb, dn);
+	if (!op_dn) {
+		ldb_asprintf_errstring(ldb, 
+				       "could not parse attribute as a DN");
+		return LDB_ERR_INVALID_DN_SYNTAX;
+	}
+
+	os = talloc_zero(ac, struct la_op_store);
+	if (!os) {
+		ldb_oom(ldb);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	os->op = op;
+
+	ret = la_guid_from_dn(ac, op_dn, &os->guid);
+	talloc_free(op_dn);
+	if (ret == LDB_ERR_NO_SUCH_OBJECT && ac->req->operation == LDB_DELETE) {
+		/* we are deleting an object, and we've found it has a
+		 * forward link to a target that no longer
+		 * exists. This is not an error in the delete, and we
+		 * should just not do the deferred delete of the
+		 * target attribute
+		 */
+		talloc_free(os);
+		return LDB_SUCCESS;
+	}
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	os->name = talloc_strdup(os, name);
+	if (!os->name) {
+		ldb_oom(ldb);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	/* Do deletes before adds */
+	if (op == LA_OP_ADD) {
+		DLIST_ADD_END(ac->ops, os, struct la_op_store *);
+	} else {
+		/* By adding to the head of the list, we do deletes before
+		 * adds when processing a replace */
+		DLIST_ADD(ac->ops, os);
+	}
+
+	return LDB_SUCCESS;
+}
+
+static int la_queue_mod_request(struct la_context *ac);
+static int la_down_req(struct la_context *ac);
+
+
+
+/* add */
+static int linked_attributes_add(struct ldb_module *module, struct ldb_request *req)
+{
+	struct ldb_context *ldb;
+	const struct dsdb_attribute *target_attr;
+	struct la_context *ac;
+	const char *attr_name;
+	struct ldb_control *ctrl;
+	int ret;
+	int i, j;
+
+	ldb = ldb_module_get_ctx(module);
+
+	if (ldb_dn_is_special(req->op.add.message->dn)) {
+		/* do not manipulate our control entries */
+		return ldb_next_request(module, req);
+	}
+
+	if (!(ctrl = ldb_request_get_control(req, DSDB_CONTROL_APPLY_LINKS))) {
+		/* don't do anything special for linked attributes, repl_meta_data has done it */
+		return ldb_next_request(module, req);
+	}
+	ctrl->critical = false;
+
+	ac = linked_attributes_init(module, req);
+	if (!ac) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list