[SCM] Samba Shared Repository - branch master updated
Stefan Metzmacher
metze at samba.org
Tue May 18 07:31:47 MDT 2010
The branch, master has been updated
via a79b446... s4:smb_server: add dfs smbtorture to selftests
via fc94c50... s4:smb_server: Implement GET_DFS_REFERRAL for domain referral requests
via 90d7689... s4:smb_server: fix trailling whitespace in trans2.c
via 9f01e7a... s4 torture: Add tests for dfs referrals handling in SMB/trans2 requests
via 0e4e39c... s4 torture test: Adapt ndr-dfsblobs torture test to new idl
via 970cbad... librpc/idl: fix errors and improve idl in dfsblobs
via 6f26410... s4:librpc: fix the autoconf build
via 9b9def0... s4:dynconfig: let the autoconf build compile again
from 4108728... s3-spoolss: Use the spoolss_map_to_os2_driver to modify drivername.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit a79b446e11c56de5244ec9b9823c436122fe5ffe
Author: Matthieu Patou <mat at matws.net>
Date: Tue May 11 21:22:24 2010 +0400
s4:smb_server: add dfs smbtorture to selftests
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit fc94c50a9fe0ef344068feafa21d85adb149b6b3
Author: Matthieu Patou <mat at matws.net>
Date: Sat May 1 22:27:31 2010 +0400
s4:smb_server: Implement GET_DFS_REFERRAL for domain referral requests
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 90d768989cff597a5b241ee14ba04024a3bda45a
Author: Matthieu Patou <mat at matws.net>
Date: Sat May 1 22:33:20 2010 +0400
s4:smb_server: fix trailling whitespace in trans2.c
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 9f01e7af6b5f0ab8022baabf097af6be82f13877
Author: Matthieu Patou <mat at matws.net>
Date: Mon May 10 01:39:27 2010 +0400
s4 torture: Add tests for dfs referrals handling in SMB/trans2 requests
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 0e4e39c7f51a6fe95485710454b5ced1a6ef7a51
Author: Matthieu Patou <mat at matws.net>
Date: Mon May 10 01:40:31 2010 +0400
s4 torture test: Adapt ndr-dfsblobs torture test to new idl
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 970cbad79ab4b6cad73dd75daae4f896dde92f38
Author: Matthieu Patou <mat at matws.net>
Date: Mon Apr 26 01:31:19 2010 +0400
librpc/idl: fix errors and improve idl in dfsblobs
Fix problems between strings and nstring
Allow get_deferral parameters to be used by ndr_push/pull_blobs
Handle correctly the 16 bytes padding
Signed-off-by: Stefan Metzmacher <metze at samba.org>
commit 6f264106a4476eb138df568f66d0a7a0216fb9fa
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue May 18 14:49:39 2010 +0200
s4:librpc: fix the autoconf build
metze
commit 9b9def0d724da1b20ca175c84ec03242748e45be
Author: Stefan Metzmacher <metze at samba.org>
Date: Tue May 18 13:50:33 2010 +0200
s4:dynconfig: let the autoconf build compile again
metze
-----------------------------------------------------------------------
Summary of changes:
librpc/idl/dfsblobs.idl | 38 +-
selftest/target/Samba4.pm | 4 +-
source4/dynconfig/config.mk | 7 +-
source4/librpc/config.mk | 7 +-
source4/selftest/tests.sh | 6 +
source4/smb_server/smb/trans2.c | 922 +++++++++++++++++++++++++++++++++++++--
source4/torture/config.mk | 9 +-
source4/torture/dfs/common.c | 71 +++
source4/torture/dfs/domaindfs.c | 488 +++++++++++++++++++++
source4/torture/ndr/dfsblob.c | 4 +-
source4/torture/torture.c | 1 +
source4/torture/wscript_build | 11 +-
12 files changed, 1522 insertions(+), 46 deletions(-)
create mode 100644 source4/torture/dfs/common.c
create mode 100644 source4/torture/dfs/domaindfs.c
Changeset truncated at 500 lines:
diff --git a/librpc/idl/dfsblobs.idl b/librpc/idl/dfsblobs.idl
index ffd3e6e..88147b6 100644
--- a/librpc/idl/dfsblobs.idl
+++ b/librpc/idl/dfsblobs.idl
@@ -54,16 +54,12 @@ interface dfsblobs
[relative_short] nstring *DFS_alt_path;
[relative_short] nstring *netw_address;
/* As stated in MS DFSC 2.2.4.3.1 this array was guid but now MUST be 16 null bytes*/
- uint8 service_site_guid[16];
} dfs_normal_referral;
typedef struct {
[relative_short] nstring *special_name;
uint16 nb_expanded_names;
- [relative_short] [flag(STR_NOTERM|NDR_REMAINING)] string_array *expanded_names;
- /*[relative_short] nstring_array expanded_names2;*/
- /* As stated in MS DFSC 2.2.4.3.1 this array was guid but now MUST be 16 null bytes*/
- uint8 service_site_guid[16];
+ [relative_short,subcontext(0),flag(STR_NOTERM|NDR_REMAINING)] string_array *expanded_names;
} dfs_domain_referral;
typedef [nodiscriminant] union {
@@ -72,12 +68,23 @@ interface dfsblobs
[default];
} dfs_referral;
+ typedef [nodiscriminant] union {
+ [case(16)] uint8 *value;
+ [default];
+ } dfs_padding;
+
typedef [flag(NDR_NOALIGN)] struct {
- uint16 size;
DFS_SERVER_TYPE server_type;
DFS_FLAGS_REFERRAL entry_flags;
uint32 ttl;
[switch_is(entry_flags & DFS_FLAG_REFERRAL_DOMAIN_RESP)] dfs_referral referrals;
+ } dfs_referral_v3_remaining;
+
+ typedef [flag(NDR_NOALIGN)] struct {
+ uint16 size;
+ dfs_referral_v3_remaining data;
+ /* this is either 0 or 16 bytes */
+ [switch_is(size - 18)] dfs_padding service_site_guid;
} dfs_referral_v3;
typedef struct {
@@ -85,7 +92,7 @@ interface dfsblobs
DFS_SERVER_TYPE server_type;
DFS_FLAGS_REFERRAL entry_flags;
uint32 ttl;
- dfs_normal_referral referrals;
+ dfs_normal_referral r1;
} dfs_referral_v4;
typedef [nodiscriminant] union {
@@ -104,13 +111,18 @@ interface dfsblobs
typedef [public] struct {
uint16 path_consumed;
uint16 nb_referrals;
- uint32 header_flags;
+ DFS_HEADER_FLAG header_flags;
dfs_referral_type referral_entries[nb_referrals];
} dfs_referral_resp;
- [public] void dfs_GetDFSReferral(
- [in] uint16 max_referral_level,
- [in] nstring servername,
- [out,ref] dfs_referral_resp *resp
- );
+ typedef [public] struct {
+ uint16 max_referral_level;
+ nstring servername;
+ } dfs_GetDFSReferral_in;
+
+ [public] void dfs_GetDFSReferral(
+ [in] dfs_GetDFSReferral_in req,
+ [out,ref] dfs_referral_resp *resp
+ );
+
}
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 69add20..e82ccfd 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -732,12 +732,14 @@ sub provision($$$$$$$)
push(@{$ctx->{directories}}, "$ctx->{tmpdir}");
push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test1");
push(@{$ctx->{directories}}, "$ctx->{tmpdir}/test2");
-
+ my $msdfs = "no";
+ $msdfs = "yes" if ($server_role eq "domain controller");
$ctx->{smb_conf_extra_options} = "
max xmit = 32K
server max protocol = SMB2
$extra_smbconf_options
+ host msdfs = $msdfs
[tmp]
path = $ctx->{tmpdir}
diff --git a/source4/dynconfig/config.mk b/source4/dynconfig/config.mk
index 976ca71..c4738b8 100644
--- a/source4/dynconfig/config.mk
+++ b/source4/dynconfig/config.mk
@@ -22,4 +22,9 @@ $(dynconfigsrcdir)/dynconfig.o: CFLAGS+=-DCONFIGFILE=\"$(CONFIG4FILE)\" -DBINDIR
-DWINBINDD_PRIVILEGED_SOCKET_DIR=\"$(winbindd_privileged_socket_dir)\" \
-DWINBINDD_SOCKET_DIR=\"$(winbindd_socket_dir)\" \
-DNTP_SIGND_SOCKET_DIR=\"$(ntp_signd_socket_dir)\" \
- -DPYTHONDIR=\"$(pythondir)\"
+ -DPYTHONDIR=\"$(pythondir)\" \
+ -DCODEPAGEDIR=\"$(codepagedir)\" \
+ -DLIBDIR=\"$(libdir)\" \
+ -DSTATEDIR=\"$(localstatedir)\" \
+ -DCACHEDIR=\"$(cachedir)\" \
+ -DSMB_PASSWD_FILE=\"$(privatedir)/smbpasswd\"
diff --git a/source4/librpc/config.mk b/source4/librpc/config.mk
index 5985e92..5fe944a 100644
--- a/source4/librpc/config.mk
+++ b/source4/librpc/config.mk
@@ -301,6 +301,11 @@ PUBLIC_DEPENDENCIES = LIBNDR NDR_STANDARD
NDR_NTLMSSP_OBJ_FILES = ../librpc/gen_ndr/ndr_ntlmssp.o ../librpc/ndr/ndr_ntlmssp.o
+[SUBSYSTEM::NDR_NTPRINTING]
+PUBLIC_DEPENDENCIES = LIBNDR NDR_STANDARD
+
+NDR_NTPRINTING_OBJ_FILES = ../librpc/gen_ndr/ndr_ntprinting.o ../librpc/ndr/ndr_ntprinting.o
+
$(librpcsrcdir)/idl-deps:
$(PERL) $(librpcsrcdir)/idl-deps.pl $(wildcard $(librpcsrcdir)/idl/*.idl ../librpc/idl/*.idl) >$@
@@ -357,7 +362,7 @@ PUBLIC_DEPENDENCIES = \
NDR_FRSRPC NDR_FRSAPI NDR_FRSTRANS \
NDR_NFS4ACL NDR_NTP_SIGND \
NDR_DCOM NDR_WMI NDR_NAMED_PIPE_AUTH \
- NDR_NTLMSSP NDR_DFSBLOBS
+ NDR_NTLMSSP NDR_NTPRINTING NDR_DFSBLOBS
NDR_TABLE_OBJ_FILES = ../librpc/ndr/ndr_table.o $(gen_ndrsrcdir)/tables.o
diff --git a/source4/selftest/tests.sh b/source4/selftest/tests.sh
index 47bfba2..769e169 100755
--- a/source4/selftest/tests.sh
+++ b/source4/selftest/tests.sh
@@ -223,7 +223,13 @@ for bindoptions in connect $VALIDATE ; do
done
done
done
+# Tests for the DFS referral calls implementation
+dfsc=`$smb4torture --list | grep "^DFS-" | xargs`
+
+for t in $dfsc; do
+ plansmbtorturetestsuite "$t" dc $ADDARGS //\$SERVER/ipc$ -U"\$USERNAME"%"\$PASSWORD"
+done
# Tests for the NET API
diff --git a/source4/smb_server/smb/trans2.c b/source4/smb_server/smb/trans2.c
index 36dc317..e7e8edc 100644
--- a/source4/smb_server/smb/trans2.c
+++ b/source4/smb_server/smb/trans2.c
@@ -2,6 +2,7 @@
Unix SMB/CIFS implementation.
transaction2 handling
Copyright (C) Andrew Tridgell 2003
+ Copyright Matthieu Patou 2010 mat at matws.net
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -21,10 +22,20 @@
*/
#include "includes.h"
+#include "smbd/service_stream.h"
#include "smb_server/smb_server.h"
#include "ntvfs/ntvfs.h"
#include "libcli/raw/libcliraw.h"
#include "libcli/raw/raw_proto.h"
+#include "librpc/gen_ndr/dfsblobs.h"
+#include "librpc/gen_ndr/ndr_dfsblobs.h"
+#include "dsdb/samdb/samdb.h"
+#include "auth/session.h"
+#include "param/param.h"
+#include "lib/tsocket/tsocket.h"
+
+#define MAX_DFS_RESPONSE 56*1024 /* 56 Kb */
+#define DEFAULT_SITE_NAME "Default-First-Site-Name"
#define TRANS2_CHECK_ASYNC_STATUS_SIMPLE do { \
if (!NT_STATUS_IS_OK(req->ntvfs->async_states->status)) { \
@@ -53,7 +64,13 @@ struct trans_op {
NTSTATUS (*send_fn)(struct trans_op *);
void *op_info;
};
-
+/* A DC set is a group of DC, they might have been grouped together
+ because they belong to the same site, or to site with same cost ...
+*/
+struct dc_set {
+ const char **names;
+ uint32_t count;
+};
#define CHECK_MIN_BLOB_SIZE(blob, size) do { \
if ((blob)->length < (size)) { \
return NT_STATUS_INFO_LENGTH_MISMATCH; \
@@ -204,7 +221,7 @@ static NTSTATUS trans2_open_send(struct trans_op *op)
smbsrv_push_fnum(trans->out.params.data, VWV(0), io->t2open.out.file.ntvfs);
SSVAL(trans->out.params.data, VWV(1), io->t2open.out.attrib);
- srv_push_dos_date3(req->smb_conn, trans->out.params.data,
+ srv_push_dos_date3(req->smb_conn, trans->out.params.data,
VWV(2), io->t2open.out.write_time);
SIVAL(trans->out.params.data, VWV(4), io->t2open.out.size);
SSVAL(trans->out.params.data, VWV(6), io->t2open.out.access);
@@ -239,7 +256,7 @@ static NTSTATUS trans2_open(struct smbsrv_request *req, struct trans_op *op)
io->t2open.in.open_mode = SVAL(trans->in.params.data, VWV(1));
io->t2open.in.search_attrs = SVAL(trans->in.params.data, VWV(2));
io->t2open.in.file_attrs = SVAL(trans->in.params.data, VWV(3));
- io->t2open.in.write_time = srv_pull_dos_date(req->smb_conn,
+ io->t2open.in.write_time = srv_pull_dos_date(req->smb_conn,
trans->in.params.data + VWV(4));
io->t2open.in.open_func = SVAL(trans->in.params.data, VWV(6));
io->t2open.in.size = IVAL(trans->in.params.data, VWV(7));
@@ -300,8 +317,8 @@ static NTSTATUS trans2_mkdir(struct smbsrv_request *req, struct trans_op *op)
return NT_STATUS_FOOBAR;
}
- TRANS2_CHECK(ea_pull_list(&trans->in.data, io,
- &io->t2mkdir.in.num_eas,
+ TRANS2_CHECK(ea_pull_list(&trans->in.data, io,
+ &io->t2mkdir.in.num_eas,
&io->t2mkdir.in.eas));
op->op_info = io;
@@ -362,7 +379,7 @@ static NTSTATUS trans2_push_fileinfo(struct smbsrv_connection *smb_conn,
st->ea_list.out.eas);
TRANS2_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, list_size));
- ea_put_list(blob->data,
+ ea_put_list(blob->data,
st->ea_list.out.num_eas, st->ea_list.out.eas);
return NT_STATUS_OK;
@@ -371,7 +388,7 @@ static NTSTATUS trans2_push_fileinfo(struct smbsrv_connection *smb_conn,
st->all_eas.out.eas);
TRANS2_CHECK(smbsrv_blob_grow_data(mem_ctx, blob, list_size));
- ea_put_list(blob->data,
+ ea_put_list(blob->data,
st->all_eas.out.num_eas, st->all_eas.out.eas);
return NT_STATUS_OK;
@@ -472,7 +489,7 @@ static NTSTATUS trans2_qpathinfo(struct smbsrv_request *req, struct trans_op *op
}
if (st->generic.level == RAW_FILEINFO_EA_LIST) {
- TRANS2_CHECK(ea_pull_name_list(&trans->in.data, req,
+ TRANS2_CHECK(ea_pull_name_list(&trans->in.data, req,
&st->ea_list.in.num_names,
&st->ea_list.in.ea_names));
}
@@ -513,7 +530,7 @@ static NTSTATUS trans2_qfileinfo(struct smbsrv_request *req, struct trans_op *op
}
if (st->generic.level == RAW_FILEINFO_EA_LIST) {
- TRANS2_CHECK(ea_pull_name_list(&trans->in.data, req,
+ TRANS2_CHECK(ea_pull_name_list(&trans->in.data, req,
&st->ea_list.in.num_names,
&st->ea_list.in.ea_names));
}
@@ -553,8 +570,8 @@ static NTSTATUS trans2_parse_sfileinfo(struct smbsrv_request *req,
return NT_STATUS_OK;
case RAW_SFILEINFO_EA_SET:
- return ea_pull_list(blob, req,
- &st->ea_set.in.num_eas,
+ return ea_pull_list(blob, req,
+ &st->ea_set.in.num_eas,
&st->ea_set.in.eas);
case SMB_SFILEINFO_BASIC_INFO:
@@ -698,7 +715,7 @@ struct find_state {
};
/*
- fill a single entry in a trans2 find reply
+ fill a single entry in a trans2 find reply
*/
static NTSTATUS find_fill_info(struct find_state *state,
const union smb_search_data *file)
@@ -730,7 +747,7 @@ static NTSTATUS find_fill_info(struct find_state *state,
SIVAL(data, 12, file->standard.size);
SIVAL(data, 16, file->standard.alloc_size);
SSVAL(data, 20, file->standard.attrib);
- TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->standard.name.s,
+ TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->standard.name.s,
ofs + 22, SMBSRV_REQ_DEFAULT_STR_FLAGS(req),
STR_LEN8BIT | STR_TERMINATE | STR_LEN_NOTERM));
break;
@@ -751,7 +768,7 @@ static NTSTATUS find_fill_info(struct find_state *state,
SIVAL(data, 16, file->ea_size.alloc_size);
SSVAL(data, 20, file->ea_size.attrib);
SIVAL(data, 22, file->ea_size.ea_size);
- TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->ea_size.name.s,
+ TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->ea_size.name.s,
ofs + 26, SMBSRV_REQ_DEFAULT_STR_FLAGS(req),
STR_LEN8BIT | STR_NOALIGN));
TRANS2_CHECK(smbsrv_blob_fill_data(trans, &trans->out.data, trans->out.data.length + 1));
@@ -774,7 +791,7 @@ static NTSTATUS find_fill_info(struct find_state *state,
SIVAL(data, 16, file->ea_list.alloc_size);
SSVAL(data, 20, file->ea_list.attrib);
ea_put_list(data+22, file->ea_list.eas.num_eas, file->ea_list.eas.eas);
- TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->ea_list.name.s,
+ TRANS2_CHECK(smbsrv_blob_append_string(trans, &trans->out.data, file->ea_list.name.s,
ofs + 22 + ea_size, SMBSRV_REQ_DEFAULT_STR_FLAGS(req),
STR_LEN8BIT | STR_NOALIGN));
TRANS2_CHECK(smbsrv_blob_fill_data(trans, &trans->out.data, trans->out.data.length + 1));
@@ -844,6 +861,857 @@ static NTSTATUS trans2_findfirst_send(struct trans_op *op)
/*
+ fill a referral type structure
+ */
+static NTSTATUS fill_normal_dfs_referraltype(struct dfs_referral_type *ref,
+ uint16_t version,
+ const char *dfs_path,
+ const char *server_path, int isfirstoffset)
+{
+
+ switch (version) {
+ case 3:
+ ZERO_STRUCTP(ref);
+ ref->version = version;
+ ref->referral.v3.data.server_type = DFS_SERVER_NON_ROOT;
+ ref->referral.v3.size = 18;
+
+ ref->referral.v3.data.entry_flags = 0;
+ ref->referral.v3.data.ttl = 600; /* As w2k3 */
+ ref->referral.v3.data.referrals.r1.DFS_path = dfs_path;
+ ref->referral.v3.data.referrals.r1.DFS_alt_path = dfs_path;
+ ref->referral.v3.data.referrals.r1.netw_address = server_path;
+ return NT_STATUS_OK;
+ case 4:
+ ZERO_STRUCTP(ref);
+ ref->version = version;
+ ref->referral.v4.server_type = DFS_SERVER_NON_ROOT;
+ ref->referral.v4.size = 18;
+
+ if (isfirstoffset) {
+ ref->referral.v4.entry_flags = DFS_HEADER_FLAG_TARGET_BCK;
+ }
+ ref->referral.v4.ttl = 600; /* As w2k3 */
+ ref->referral.v4.r1.DFS_path = dfs_path;
+ ref->referral.v4.r1.DFS_alt_path = dfs_path;
+ ref->referral.v4.r1.netw_address = server_path;
+
+ return NT_STATUS_OK;
+ }
+ return NT_STATUS_INVALID_LEVEL;
+}
+
+/*
+ fill a domain refererral
+ */
+static NTSTATUS fill_domain_dfs_referraltype(struct dfs_referral_type *ref,
+ uint16_t version,
+ const char *domain,
+ const char **names,
+ uint16_t numnames)
+{
+ switch (version) {
+ case 3:
+ ZERO_STRUCTP(ref);
+ ref->version = version;
+ ref->referral.v3.data.server_type = DFS_SERVER_NON_ROOT;
+ ref->referral.v3.size = 34;
+ ref->referral.v3.data.entry_flags = DFS_FLAG_REFERRAL_DOMAIN_RESP;
+ ref->referral.v3.data.ttl = 600; /* As w2k3 */
+ ref->referral.v3.data.referrals.r2.special_name = domain;
+ ref->referral.v3.data.referrals.r2.nb_expanded_names = numnames;
+ /* Put the final terminator */
+ if (names) {
+ const char **names2 = talloc_array(ref, const char *, numnames+1);
+ NT_STATUS_HAVE_NO_MEMORY(names2);
+ int i;
+ for (i = 0; i<numnames; i++) {
+ names2[i] = talloc_asprintf(names2, "\\%s", names[i]);
+ NT_STATUS_HAVE_NO_MEMORY(names2[i]);
+ }
+ names2[numnames] = 0;
+ ref->referral.v3.data.referrals.r2.expanded_names = names2;
+ }
+ return NT_STATUS_OK;
+ }
+ return NT_STATUS_INVALID_LEVEL;
+}
+
+/*
+ get the DCs list within a site
+ */
+static NTSTATUS get_dcs_insite(TALLOC_CTX *ctx, struct ldb_context *ldb,
+ struct ldb_dn *sitedn, struct dc_set *list,
+ bool dofqdn)
+{
+ static const char *attrs[] = { "serverReference", NULL };
+ static const char *attrs2[] = { "dNSHostName", "sAMAccountName", NULL };
+ struct ldb_result *r;
+ unsigned int i;
+ int ret;
+ const char **dc_list;
+
+ ret = ldb_search(ldb, ctx, &r, sitedn, LDB_SCOPE_SUBTREE, attrs,
+ "(&(objectClass=server)(serverReference=*))");
+ if (ret != LDB_SUCCESS) {
+ DEBUG(2,(__location__ ": Failed to get list of servers - %s\n",
+ ldb_errstring(ldb)));
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ if (r->count == 0) {
+ /* none in this site */
+ talloc_free(r);
+ return NT_STATUS_OK;
+ }
+
+ /*
+ * need to search for all server object to know the size of the array.
+ * Search all the object of class server in this site
+ */
+ dc_list = talloc_array(r, const char *, r->count);
+ NT_STATUS_HAVE_NO_MEMORY_AND_FREE(dc_list, r);
+
+ /* TODO put some random here in the order */
+ list->names = talloc_realloc(list, list->names, const char *, list->count + r->count);
+ NT_STATUS_HAVE_NO_MEMORY_AND_FREE(list->names, r);
+
+ for (i = 0; i<r->count; i++) {
+ struct ldb_dn *dn;
+ struct ldb_result *r2;
+
+ dn = ldb_msg_find_attr_as_dn(ldb, ctx, r->msgs[i], "serverReference");
+ if (!dn) {
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ ret = ldb_search(ldb, r, &r2, dn, LDB_SCOPE_BASE, attrs2, "(objectClass=computer)");
+ if (ret != LDB_SUCCESS) {
+ DEBUG(2,(__location__ ": Search for computer on %s failed - %s\n",
+ ldb_dn_get_linearized(dn), ldb_errstring(ldb)));
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ if (dofqdn) {
+ const char *dns = ldb_msg_find_attr_as_string(r2->msgs[0], "dNSHostName", NULL);
+ if (dns == NULL) {
+ DEBUG(2,(__location__ ": dNSHostName missing on %s\n",
+ ldb_dn_get_linearized(dn)));
+ talloc_free(r);
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ list->names[list->count] = talloc_strdup(list->names, dns);
+ NT_STATUS_HAVE_NO_MEMORY_AND_FREE(list->names[list->count], r);
+ } else {
+ char *tmp;
+ const char *acct = ldb_msg_find_attr_as_string(r2->msgs[0], "sAMAccountName", NULL);
+ if (acct == NULL) {
+ DEBUG(2,(__location__ ": sAMAccountName missing on %s\n",
+ ldb_dn_get_linearized(dn)));
+ talloc_free(r);
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ tmp = talloc_strdup(list->names, acct);
+ NT_STATUS_HAVE_NO_MEMORY_AND_FREE(tmp, r);
+
+ /* Netbios name is also the sAMAccountName for
+ computer but without the final $ */
+ tmp[strlen(tmp) - 1] = '\0';
+ list->names[list->count] = tmp;
+ }
+ list->count++;
+ talloc_free(r2);
+ }
+
+ talloc_free(r);
+ return NT_STATUS_OK;
+}
+
+
+/*
+ get all DCs
+ */
+static NTSTATUS get_dcs(TALLOC_CTX *ctx, struct ldb_context *ldb,
+ const char *searched_site, bool need_fqdn,
+ struct dc_set ***pset_list, uint32_t flags)
+{
+ /*
--
Samba Shared Repository
More information about the samba-cvs
mailing list