diff --git a/source4/librpc/idl/irpc.idl b/source4/librpc/idl/irpc.idl index c28f861bd71..4c4a8810fee 100644 --- a/source4/librpc/idl/irpc.idl +++ b/source4/librpc/idl/irpc.idl @@ -47,4 +47,34 @@ [out,switch_is(level)] nbtd_info info ); + + /****************************************************** + management calls for the smb server + ******************************************************/ + typedef [v1_enum] enum { + SMBSRV_INFO_SESSIONS + } smbsrv_info_level; + + typedef struct { + uint16 vuid; + astring account_name; + astring domain_name; + astring client_ip; + NTTIME connect_time; + } smbsrv_session_info; + + typedef struct { + uint32 num_sessions; + [size_is(num_sessions)] smbsrv_session_info *sessions; + } smbsrv_sessions; + + typedef union { + [case(SMBSRV_INFO_SESSIONS)] smbsrv_sessions sessions; + } smbsrv_info; + + void smbsrv_information( + [in] smbsrv_info_level level, + [out,switch_is(level)] smbsrv_info info + ); + } diff --git a/source4/smb_server/config.mk b/source4/smb_server/config.mk index 70d2ea09269..d9616939389 100644 --- a/source4/smb_server/config.mk +++ b/source4/smb_server/config.mk @@ -17,7 +17,8 @@ ADD_OBJ_FILES = \ smb_server/sesssetup.o \ smb_server/srvtime.o \ smb_server/trans2.o \ - smb_server/signing.o + smb_server/signing.o \ + smb_server/management.o REQUIRED_SUBSYSTEMS = \ NTVFS # End SUBSYSTEM SMB diff --git a/source4/smb_server/management.c b/source4/smb_server/management.c new file mode 100644 index 00000000000..82828183600 --- /dev/null +++ b/source4/smb_server/management.c @@ -0,0 +1,83 @@ +/* + Unix SMB/CIFS implementation. + + management calls for smb server + + Copyright (C) Andrew Tridgell 2005 + + 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 + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" +#include "smb_server/smb_server.h" +#include "smbd/service_stream.h" +#include "lib/messaging/irpc.h" +#include "librpc/gen_ndr/ndr_irpc.h" +#include "auth/auth.h" + +/* + return a list of open sessions +*/ +static NTSTATUS smbsrv_session_information(struct irpc_message *msg, + struct smbsrv_information *r) +{ + struct smbsrv_connection *smb_conn = talloc_get_type(msg->private, struct smbsrv_connection); + int i=0, count=0; + struct smbsrv_session *sess; + + /* count the number of sessions */ + for (sess=smb_conn->sessions.list; sess; sess=sess->next) { + count++; + } + + r->out.info.sessions.num_sessions = count; + r->out.info.sessions.sessions = talloc_array(r, struct smbsrv_session_info, count); + NT_STATUS_HAVE_NO_MEMORY(r->out.info.sessions.sessions); + + for (sess=smb_conn->sessions.list; sess; sess=sess->next) { + struct smbsrv_session_info *info = &r->out.info.sessions.sessions[i]; + info->vuid = sess->vuid; + info->account_name = sess->session_info->server_info->account_name; + info->domain_name = sess->session_info->server_info->domain_name; + info->connect_time = timeval_to_nttime(&sess->connect_time); + info->client_ip = socket_get_peer_addr(smb_conn->connection->socket, r); + i++; + } + + return NT_STATUS_OK; +} + +/* + serve smbserver information via irpc +*/ +static NTSTATUS smbsrv_information(struct irpc_message *msg, + struct smbsrv_information *r) +{ + switch (r->in.level) { + case SMBSRV_INFO_SESSIONS: + return smbsrv_session_information(msg, r); + } + + return NT_STATUS_OK; +} + +/* + initialise irpc management calls on a connection +*/ +void smbsrv_management_init(struct smbsrv_connection *smb_conn) +{ + IRPC_REGISTER(smb_conn->connection->msg_ctx, irpc, SMBSRV_INFORMATION, + smbsrv_information, smb_conn); +} diff --git a/source4/smb_server/session.c b/source4/smb_server/session.c index d7b7f22cd8e..0bee536b937 100644 --- a/source4/smb_server/session.c +++ b/source4/smb_server/session.c @@ -1,7 +1,7 @@ /* Unix SMB/CIFS implementation. Password and authentication handling - Copyright (C) Andrew Tridgell 1992-1998 + Copyright (C) Andrew Tridgell 1992-2005 Copyright (C) Andrew Bartlett 2005 This program is free software; you can redistribute it and/or modify @@ -21,6 +21,7 @@ #include "includes.h" #include "smb_server/smb_server.h" +#include "dlinklist.h" /**************************************************************************** @@ -61,7 +62,7 @@ invalidate a session ****************************************************************************/ static int smbsrv_session_destructor(void *p) { - struct smbsrv_session *sess = p; + struct smbsrv_session *sess = talloc_get_type(p, struct smbsrv_session); struct smbsrv_connection *smb_conn = sess->smb_conn; /* clear the vuid from the 'cache' on each connection, and @@ -71,6 +72,8 @@ static int smbsrv_session_destructor(void *p) smb_conn->sessions.num_validated_vuids--; idr_remove(smb_conn->sessions.idtree_vuid, sess->vuid); + + DLIST_REMOVE(smb_conn->sessions.list, sess); return 0; } @@ -129,8 +132,10 @@ struct smbsrv_session *smbsrv_register_session(struct smbsrv_connection *smb_con sess->session_info = talloc_reference(sess, session_info); sess->gensec_ctx = talloc_reference(sess, gensec_ctx); - sess->smb_conn = smb_conn; + sess->connect_time = timeval_current(); + + DLIST_ADD(smb_conn->sessions.list, sess); talloc_set_destructor(sess, smbsrv_session_destructor); diff --git a/source4/smb_server/smb_server.c b/source4/smb_server/smb_server.c index 539627f3612..86e31f7fd8f 100644 --- a/source4/smb_server/smb_server.c +++ b/source4/smb_server/smb_server.c @@ -774,6 +774,8 @@ static void smbsrv_accept(struct stream_connection *conn) conn->private = smb_conn; irpc_add_name(conn->msg_ctx, "smb_server"); + + smbsrv_management_init(smb_conn); } diff --git a/source4/smb_server/smb_server.h b/source4/smb_server/smb_server.h index e6f9792f04e..df49825e0e2 100644 --- a/source4/smb_server/smb_server.h +++ b/source4/smb_server/smb_server.h @@ -51,6 +51,8 @@ struct smbsrv_session { /* Distinguish between a VUID allocated for the multi-pass * extended secrity session setup and one that is finished */ BOOL finished_sesssetup; + + struct timeval connect_time; }; /* we need a forward declaration of the ntvfs_ops strucutre to prevent @@ -224,6 +226,10 @@ struct smbsrv_connection { /* this holds info on session vuids that are already * validated for this VC */ struct idr_context *idtree_vuid; + + /* also kept as a link list so it can be enumerated by + the management code */ + struct smbsrv_session *list; } sessions; /* the server_context holds a linked list of pending requests,