[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Wed Mar 2 04:59:02 MST 2011


The branch, master has been updated
       via  ea29261 s3-sessionid: avoid global include of sessionid.h
       via  28acf36 s3-lanman: talk to srvsvc dcerpc server in api_RNetSessionEnum().
       via  bd675e0 s4-smbtorture: add netsessionenum rap torture test.
       via  c884e62 s4-smbtorture: add smbcli_rap_netsessionenum().
       via  8df12d4 rap: add rap_NetSessionEnum to IDL.
       via  8643683 s3-server_id: only include server_id where needed.
      from  8635a38 s3: Attempt to fix the build on IRIX

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


- Log -----------------------------------------------------------------
commit ea29261186a7a65e73d84802a607315a50050614
Author: Günther Deschner <gd at samba.org>
Date:   Thu Feb 24 23:14:15 2011 +0100

    s3-sessionid: avoid global include of sessionid.h
    
    Guenther
    
    Autobuild-User: Günther Deschner <gd at samba.org>
    Autobuild-Date: Wed Mar  2 12:58:12 CET 2011 on sn-devel-104

commit 28acf360be035b606c49d5202312badcab50fa64
Author: Günther Deschner <gd at samba.org>
Date:   Fri Feb 25 12:40:45 2011 +0100

    s3-lanman: talk to srvsvc dcerpc server in api_RNetSessionEnum().
    
    Guenther

commit bd675e0b1502564b16a23d544f23762990849f5f
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 2 10:57:26 2011 +0100

    s4-smbtorture: add netsessionenum rap torture test.
    
    Guenther

commit c884e622fae971a0ea35a1d59e4d5a14bcdf9dd3
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 2 10:53:24 2011 +0100

    s4-smbtorture: add smbcli_rap_netsessionenum().
    
    Guenther

commit 8df12d405262cbefbc64edbc038a8651297d3ec9
Author: Günther Deschner <gd at samba.org>
Date:   Wed Mar 2 10:44:45 2011 +0100

    rap: add rap_NetSessionEnum to IDL.
    
    Guenther

commit 8643683dd8c32be7327ac8a69b26f3a33d0ff203
Author: Günther Deschner <gd at samba.org>
Date:   Thu Feb 24 23:05:57 2011 +0100

    s3-server_id: only include server_id where needed.
    
    Guenther

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

Summary of changes:
 librpc/idl/rap.idl                          |   30 ++++++++
 source3/include/includes.h                  |    2 -
 source3/include/proto.h                     |    2 +-
 source3/lib/messages.c                      |    1 +
 source3/lib/sessionid_tdb.c                 |    1 +
 source3/locking/brlock.c                    |    1 +
 source3/locking/locking.c                   |    1 +
 source3/nmbd/nmbd.c                         |    1 +
 source3/printing/printing.c                 |    1 +
 source3/rpc_server/spoolss/srv_spoolss_nt.c |    1 +
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c   |    1 +
 source3/rpc_server/wkssvc/srv_wkssvc_nt.c   |    1 +
 source3/smbd/lanman.c                       |   73 ++++++++++++++++---
 source3/smbd/negprot.c                      |    1 +
 source3/smbd/server.c                       |    1 +
 source3/smbd/server_exit.c                  |    1 +
 source3/smbd/session.c                      |    1 +
 source3/utils/net_serverid.c                |    2 +
 source3/utils/net_status.c                  |    1 +
 source3/utils/status.c                      |    1 +
 source3/winbindd/winbindd.c                 |    1 +
 source4/selftest/knownfail                  |    1 +
 source4/torture/rap/rap.c                   |  105 +++++++++++++++++++++++++++
 23 files changed, 218 insertions(+), 13 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/rap.idl b/librpc/idl/rap.idl
index 6b73169..7e3698a 100644
--- a/librpc/idl/rap.idl
+++ b/librpc/idl/rap.idl
@@ -907,6 +907,36 @@ interface rap
 		[out,switch_is(level)] rap_netuser_info info
 	);
 
+	typedef struct {
+		[relative_short] astring *ComputerName;
+		uint16 ComputerNameHigh;
+		[relative_short] astring *UserName;
+		uint16 UserNameHigh;
+		uint16 num_conns;
+		uint16 num_opens;
+		uint16 num_users;
+		uint32 sess_time;
+		uint32 idle_time;
+		uint32 user_flags;
+		[relative_short] astring *CliTypeName;
+		uint16 CliTypeNameHigh;
+	} rap_session_info_2;
+
+	typedef [public,nodiscriminant] union {
+		[case(2)] rap_session_info_2 info2;
+	} rap_session_info;
+
+	/* not documented in MS-RAP */
+	[public] void rap_NetSessionEnum(
+		[in] uint16 level,
+		[in] uint16 bufsize,
+		[out] rap_status status,
+		[out] uint16 convert,
+		[out] uint16 count,
+		[out] uint16 available,
+		[out,switch_is(level)] rap_session_info info[count]
+	);
+
 	/* Parameter description strings for RAP calls   */
 	/* Names are defined name for RAP call with _REQ */
 	/* appended to end.                              */
diff --git a/source3/include/includes.h b/source3/include/includes.h
index 18b5387..7914584 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -625,11 +625,9 @@ extern void *cmdline_lp_ctx;
 #include "librpc/rpc/dcerpc.h"
 #include "client.h"
 
-#include "session.h"
 #include "module.h"
 #include "packet.h"
 #include "../lib/util/talloc_stack.h"
-#include "serverid.h"
 #include "../lib/util/smb_threads.h"
 #include "../lib/util/smb_threads_internal.h"
 
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 96317b9..bfbf840 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -5159,7 +5159,7 @@ connection_struct *make_connection(struct smbd_server_connection *sconn,
 void close_cnum(connection_struct *conn, uint16 vuid);
 
 /* The following definitions come from smbd/session.c  */
-
+struct sessionid;
 bool session_init(void);
 bool session_claim(struct smbd_server_connection *sconn, user_struct *vuser);
 void session_yield(user_struct *vuser);
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index 41f67d0..1bf2cf8 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -49,6 +49,7 @@
 #include "librpc/gen_ndr/messaging.h"
 #include "librpc/gen_ndr/ndr_messaging.h"
 #include "dbwrap.h"
+#include "serverid.h"
 
 struct messaging_callback {
 	struct messaging_callback *prev, *next;
diff --git a/source3/lib/sessionid_tdb.c b/source3/lib/sessionid_tdb.c
index fe67681..1a91c04 100644
--- a/source3/lib/sessionid_tdb.c
+++ b/source3/lib/sessionid_tdb.c
@@ -19,6 +19,7 @@
 
 #include "includes.h"
 #include "dbwrap.h"
+#include "session.h"
 
 static struct db_context *session_db_ctx(void)
 {
diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c
index 3cb9487..3cf72cc 100644
--- a/source3/locking/brlock.c
+++ b/source3/locking/brlock.c
@@ -28,6 +28,7 @@
 #include "librpc/gen_ndr/messaging.h"
 #include "smbd/globals.h"
 #include "dbwrap.h"
+#include "serverid.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 00f384a..15c53d4 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -40,6 +40,7 @@
 #include "smbd/globals.h"
 #include "dbwrap.h"
 #include "../libcli/security/security.h"
+#include "serverid.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index 2ed4212..a5727ce 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -23,6 +23,7 @@
 #include "popt_common.h"
 #include "librpc/gen_ndr/messaging.h"
 #include "nmbd/nmbd.h"
+#include "serverid.h"
 
 int ClientNMB       = -1;
 int ClientDGRAM     = -1;
diff --git a/source3/printing/printing.c b/source3/printing/printing.c
index a890814..b1aff3e 100644
--- a/source3/printing/printing.c
+++ b/source3/printing/printing.c
@@ -27,6 +27,7 @@
 #include "../librpc/gen_ndr/netlogon.h"
 #include "printing/notify.h"
 #include "printing/pcap.h"
+#include "serverid.h"
 
 extern struct current_user current_user;
 extern userdom_struct current_user_info;
diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 510dde2..dc036fa 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -44,6 +44,7 @@
 #include "../librpc/gen_ndr/netlogon.h"
 #include "rpc_misc.h"
 #include "printing/notify.h"
+#include "serverid.h"
 
 /* macros stolen from s4 spoolss server */
 #define SPOOLSS_BUFFER_UNION(fn,info,level) \
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index 40687a0..4bfe5bb 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -29,6 +29,7 @@
 #include "../libcli/security/security.h"
 #include "../librpc/gen_ndr/ndr_security.h"
 #include "dbwrap.h"
+#include "session.h"
 
 extern const struct generic_mapping file_generic_mapping;
 
diff --git a/source3/rpc_server/wkssvc/srv_wkssvc_nt.c b/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
index 205f760..67089c9 100644
--- a/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
+++ b/source3/rpc_server/wkssvc/srv_wkssvc_nt.c
@@ -28,6 +28,7 @@
 #include "../libcli/auth/libcli_auth.h"
 #include "../librpc/gen_ndr/srv_wkssvc.h"
 #include "../libcli/security/security.h"
+#include "session.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
diff --git a/source3/smbd/lanman.c b/source3/smbd/lanman.c
index 64e0439..02ef033 100644
--- a/source3/smbd/lanman.c
+++ b/source3/smbd/lanman.c
@@ -5571,14 +5571,22 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
 	char *p = skip_string(param,tpscnt,str2);
 	int uLevel;
 	struct pack_desc desc;
-	struct sessionid *session_list;
-	int i, num_sessions;
+	int i;
+
+	TALLOC_CTX *mem_ctx = talloc_tos();
+	WERROR werr;
+	NTSTATUS status;
+	struct rpc_pipe_client *cli = NULL;
+	struct dcerpc_binding_handle *b = NULL;
+	struct srvsvc_NetSessInfoCtr info_ctr;
+	uint32_t totalentries, resume_handle = 0;
+	uint32_t count = 0;
 
 	if (!str1 || !str2 || !p) {
 		return False;
 	}
 
-	memset((char *)&desc,'\0',sizeof(desc));
+	ZERO_STRUCT(desc);
 
 	uLevel = get_safe_SVAL(param,tpscnt,p,0,-1);
 
@@ -5594,25 +5602,70 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
 		return False;
 	}
 
-	num_sessions = list_sessions(talloc_tos(), &session_list);
+	status = rpc_pipe_open_interface(conn,
+					 &ndr_table_srvsvc.syntax_id,
+					 conn->session_info,
+					 &conn->sconn->client_id,
+					 conn->sconn->msg_ctx,
+					 &cli);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("RNetSessionEnum: could not connect to srvsvc: %s\n",
+			  nt_errstr(status)));
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+	b = cli->binding_handle;
 
+	info_ctr.level = 1;
+	info_ctr.ctr.ctr1 = talloc_zero(talloc_tos(), struct srvsvc_NetSessCtr1);
+	if (info_ctr.ctr.ctr1 == NULL) {
+		desc.errcode = W_ERROR_V(WERR_NOMEM);
+		goto out;
+	}
+
+	status = dcerpc_srvsvc_NetSessEnum(b, mem_ctx,
+					   cli->srv_name_slash,
+					   NULL, /* client */
+					   NULL, /* user */
+					   &info_ctr,
+					   (uint32_t)-1, /* max_buffer */
+					   &totalentries,
+					   &resume_handle,
+					   &werr);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+			  nt_errstr(status)));
+		desc.errcode = W_ERROR_V(ntstatus_to_werror(status));
+		goto out;
+	}
+
+	if (!W_ERROR_IS_OK(werr)) {
+		DEBUG(0,("RNetSessionEnum: dcerpc_srvsvc_NetSessEnum failed: %s\n",
+			  win_errstr(werr)));
+		desc.errcode = W_ERROR_V(werr);
+		goto out;
+	}
+
+	count = info_ctr.ctr.ctr1->count;
+
+ out:
 	if (mdrcnt > 0) {
 		*rdata = smb_realloc_limit(*rdata,mdrcnt);
 		if (!*rdata) {
 			return False;
 		}
 	}
-	memset((char *)&desc,'\0',sizeof(desc));
+
 	desc.base = *rdata;
 	desc.buflen = mdrcnt;
 	desc.format = str2;
-	if (!init_package(&desc,num_sessions,0)) {
+	if (!init_package(&desc, count,0)) {
 		return False;
 	}
 
-	for(i=0; i<num_sessions; i++) {
-		PACKS(&desc, "z", session_list[i].remote_machine);
-		PACKS(&desc, "z", session_list[i].username);
+	for(i=0; i < count; i++) {
+		PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].client);
+		PACKS(&desc, "z", info_ctr.ctr.ctr1->array[i].user);
 		PACKI(&desc, "W", 1); /* num conns */
 		PACKI(&desc, "W", 0); /* num opens */
 		PACKI(&desc, "W", 1); /* num users */
@@ -5631,7 +5684,7 @@ static bool api_RNetSessionEnum(struct smbd_server_connection *sconn,
 	}
 	SSVALS(*rparam,0,desc.errcode);
 	SSVAL(*rparam,2,0); /* converter */
-	SSVAL(*rparam,4,num_sessions); /* count */
+	SSVAL(*rparam,4, count); /* count */
 
 	DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
 
diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c
index 9cc34d8..eb6dfa3 100644
--- a/source3/smbd/negprot.c
+++ b/source3/smbd/negprot.c
@@ -21,6 +21,7 @@
 #include "includes.h"
 #include "smbd/globals.h"
 #include "../libcli/auth/spnego.h"
+#include "serverid.h"
 
 extern fstring remote_proto;
 
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index b155302..c06eaa1 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -35,6 +35,7 @@
 #include "rpc_server/rpc_ep_setup.h"
 #include "printing/pcap.h"
 #include "printing.h"
+#include "serverid.h"
 
 #ifdef WITH_DFS
 extern int dcelogin_atmost_once;
diff --git a/source3/smbd/server_exit.c b/source3/smbd/server_exit.c
index 72bac8b..c5cdc29 100644
--- a/source3/smbd/server_exit.c
+++ b/source3/smbd/server_exit.c
@@ -42,6 +42,7 @@
 #include "../librpc/gen_ndr/srv_wkssvc.h"
 #include "printing/notify.h"
 #include "printing.h"
+#include "serverid.h"
 
 static struct files_struct *log_writeable_file_fn(
 	struct files_struct *fsp, void *private_data)
diff --git a/source3/smbd/session.c b/source3/smbd/session.c
index 93cfba3..1b391f3 100644
--- a/source3/smbd/session.c
+++ b/source3/smbd/session.c
@@ -29,6 +29,7 @@
 #include "includes.h"
 #include "smbd/globals.h"
 #include "dbwrap.h"
+#include "session.h"
 
 /********************************************************************
  called when a session is created
diff --git a/source3/utils/net_serverid.c b/source3/utils/net_serverid.c
index ab4da1d..08a1a7f 100644
--- a/source3/utils/net_serverid.c
+++ b/source3/utils/net_serverid.c
@@ -20,6 +20,8 @@
 #include "includes.h"
 #include "utils/net.h"
 #include "dbwrap.h"
+#include "serverid.h"
+#include "session.h"
 
 static int net_serverid_list_fn(const struct server_id *id,
 				uint32_t msg_flags, void *priv)
diff --git a/source3/utils/net_status.c b/source3/utils/net_status.c
index 54ad786..3359201 100644
--- a/source3/utils/net_status.c
+++ b/source3/utils/net_status.c
@@ -18,6 +18,7 @@
 
 #include "includes.h"
 #include "utils/net.h"
+#include "session.h"
 
 int net_status_usage(struct net_context *c, int argc, const char **argv)
 {
diff --git a/source3/utils/status.c b/source3/utils/status.c
index 1ad2e9b..dd7f7ea 100644
--- a/source3/utils/status.c
+++ b/source3/utils/status.c
@@ -34,6 +34,7 @@
 #include "popt_common.h"
 #include "dbwrap.h"
 #include "../libcli/security/security.h"
+#include "session.h"
 
 #define SMB_MAXPIDS		2048
 static uid_t 		Ucrit_uid = 0;               /* added by OH */
diff --git a/source3/winbindd/winbindd.c b/source3/winbindd/winbindd.c
index d9a302c..a9ff410 100644
--- a/source3/winbindd/winbindd.c
+++ b/source3/winbindd/winbindd.c
@@ -33,6 +33,7 @@
 #include "secrets.h"
 #include "idmap.h"
 #include "lib/addrchange.h"
+#include "serverid.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
diff --git a/source4/selftest/knownfail b/source4/selftest/knownfail
index aff03a5..a9cc444 100644
--- a/source4/selftest/knownfail
+++ b/source4/selftest/knownfail
@@ -39,6 +39,7 @@ samba4.rpc.samr.passwords.lockout
 samba4.base.charset.*.Testing partial surrogate
 .*net.api.delshare.*				# DelShare isn't implemented yet
 samba4.rap.*netservergetinfo
+samba4.rap.*netsessionenum
 samba4.smb2.persistent.handles1
 samba4.winbind.struct.*.show_sequence     # Not yet working in winbind
 samba4.winbind.struct.*.getpwent          # Not yet working in winbind
diff --git a/source4/torture/rap/rap.c b/source4/torture/rap/rap.c
index 04c10a9..ae505b9 100644
--- a/source4/torture/rap/rap.c
+++ b/source4/torture/rap/rap.c
@@ -1529,6 +1529,109 @@ static bool test_netservergetinfo(struct torture_context *tctx,
 	return res;
 }
 
+static enum ndr_err_code ndr_pull_rap_NetSessionEnum_data(struct ndr_pull *ndr, struct rap_NetSessionEnum *r)
+{
+	uint32_t cntr_info_0;
+	TALLOC_CTX *_mem_save_info_0;
+
+	NDR_PULL_ALLOC_N(ndr, r->out.info, r->out.count);
+	_mem_save_info_0 = NDR_PULL_GET_MEM_CTX(ndr);
+	NDR_PULL_SET_MEM_CTX(ndr, r->out.info, 0);
+	for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
+		NDR_CHECK(ndr_pull_set_switch_value(ndr, &r->out.info[cntr_info_0], r->in.level));
+		NDR_CHECK(ndr_pull_rap_session_info(ndr, NDR_SCALARS, &r->out.info[cntr_info_0]));
+	}
+	for (cntr_info_0 = 0; cntr_info_0 < r->out.count; cntr_info_0++) {
+		NDR_CHECK(ndr_pull_rap_session_info(ndr, NDR_BUFFERS, &r->out.info[cntr_info_0]));
+	}
+	NDR_PULL_SET_MEM_CTX(ndr, _mem_save_info_0, 0);
+
+	return NDR_ERR_SUCCESS;
+}
+
+
+static NTSTATUS smbcli_rap_netsessionenum(struct smbcli_tree *tree,
+					  TALLOC_CTX *mem_ctx,
+					  struct rap_NetSessionEnum *r)
+{
+	struct rap_call *call;
+	NTSTATUS result = NT_STATUS_UNSUCCESSFUL;
+	int i;
+
+	call = new_rap_cli_call(tree, RAP_WsessionEnum);
+
+	if (call == NULL)
+		return NT_STATUS_NO_MEMORY;
+
+	rap_cli_push_word(call, r->in.level);
+	rap_cli_push_rcvbuf(call, r->in.bufsize);
+	rap_cli_expect_multiple_entries(call);
+
+	switch(r->in.level) {
+	case 2:
+		rap_cli_expect_format(call, "zzWWWDDDz");
+		break;
+	default:
+		result = NT_STATUS_INVALID_PARAMETER;
+		goto done;
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_IN_DEBUG(rap_NetSessionEnum, r);
+	}
+
+	result = rap_cli_do_call(tree, call);
+
+	if (!NT_STATUS_IS_OK(result))
+		goto done;
+
+	result = NT_STATUS_INVALID_PARAMETER;
+
+	NDR_GOTO(ndr_pull_rap_status(call->ndr_pull_param, NDR_SCALARS, &r->out.status));
+	NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.convert));
+	NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.count));
+	NDR_GOTO(ndr_pull_uint16(call->ndr_pull_param, NDR_SCALARS, &r->out.available));
+
+	call->ndr_pull_data->relative_rap_convert = r->out.convert;
+
+	NDR_GOTO(ndr_pull_rap_NetSessionEnum_data(call->ndr_pull_data, r));
+
+	r->out.info = talloc_steal(mem_ctx, r->out.info);
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_OUT_DEBUG(rap_NetSessionEnum, r);
+	}
+
+	result = NT_STATUS_OK;
+
+ done:
+	talloc_free(call);
+	return result;
+}
+
+static bool test_netsessionenum(struct torture_context *tctx,
+				struct smbcli_state *cli)
+{
+	struct rap_NetSessionEnum r;
+	int i;
+	uint16_t levels[] = { 2 };
+
+	for (i=0; i < ARRAY_SIZE(levels); i++) {
+


-- 
Samba Shared Repository


More information about the samba-cvs mailing list