• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src/router/samba-3.5.8/source4/smb_server/
1/*
2   Unix SMB/CIFS implementation.
3
4   management calls for smb server
5
6   Copyright (C) Andrew Tridgell 2005
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 3 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program.  If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "includes.h"
23#include "smb_server/smb_server.h"
24#include "smbd/service_stream.h"
25#include "lib/messaging/irpc.h"
26#include "librpc/gen_ndr/ndr_irpc.h"
27#include "auth/auth.h"
28
29/*
30  return a list of open sessions
31*/
32static NTSTATUS smbsrv_session_information(struct irpc_message *msg,
33					   struct smbsrv_information *r)
34{
35	struct smbsrv_connection *smb_conn = talloc_get_type(msg->private_data,
36					     struct smbsrv_connection);
37	int i=0, count=0;
38	struct smbsrv_session *sess;
39
40	/* count the number of sessions */
41	for (sess=smb_conn->sessions.list; sess; sess=sess->next) {
42		count++;
43	}
44
45	r->out.info.sessions.num_sessions = count;
46	r->out.info.sessions.sessions = talloc_array(r, struct smbsrv_session_info, count);
47	NT_STATUS_HAVE_NO_MEMORY(r->out.info.sessions.sessions);
48
49	for (sess=smb_conn->sessions.list; sess; sess=sess->next) {
50		struct smbsrv_session_info *info = &r->out.info.sessions.sessions[i];
51		struct socket_address *client_addr;
52		client_addr = socket_get_peer_addr(smb_conn->connection->socket, r);
53
54		if (client_addr) {
55			info->client_ip = client_addr->addr;
56		} else {
57			info->client_ip = NULL;
58		}
59
60		info->vuid         = sess->vuid;
61		info->account_name = sess->session_info->server_info->account_name;
62		info->domain_name  = sess->session_info->server_info->domain_name;
63
64		info->connect_time = timeval_to_nttime(&sess->statistics.connect_time);
65		info->auth_time    = timeval_to_nttime(&sess->statistics.auth_time);
66		info->last_use_time= timeval_to_nttime(&sess->statistics.last_request_time);
67		i++;
68	}
69
70	return NT_STATUS_OK;
71}
72
73/*
74  return a list of tree connects
75*/
76static NTSTATUS smbsrv_tcon_information(struct irpc_message *msg,
77					struct smbsrv_information *r)
78{
79	struct smbsrv_connection *smb_conn = talloc_get_type(msg->private_data,
80					     struct smbsrv_connection);
81	int i=0, count=0;
82	struct smbsrv_tcon *tcon;
83
84	/* count the number of tcons */
85	for (tcon=smb_conn->smb_tcons.list; tcon; tcon=tcon->next) {
86		count++;
87	}
88
89	r->out.info.tcons.num_tcons = count;
90	r->out.info.tcons.tcons = talloc_array(r, struct smbsrv_tcon_info, count);
91	NT_STATUS_HAVE_NO_MEMORY(r->out.info.tcons.tcons);
92
93	for (tcon=smb_conn->smb_tcons.list; tcon; tcon=tcon->next) {
94		struct smbsrv_tcon_info *info = &r->out.info.tcons.tcons[i];
95		struct socket_address *client_addr;
96		client_addr = socket_get_peer_addr(smb_conn->connection->socket, r);
97
98		if (client_addr) {
99			info->client_ip = client_addr->addr;
100		} else {
101			info->client_ip = NULL;
102		}
103
104		info->tid          = tcon->tid;
105		info->share_name   = tcon->share_name;
106		info->connect_time = timeval_to_nttime(&tcon->statistics.connect_time);
107		info->last_use_time= timeval_to_nttime(&tcon->statistics.last_request_time);
108		i++;
109	}
110
111	return NT_STATUS_OK;
112}
113
114/*
115  serve smbserver information via irpc
116*/
117static NTSTATUS smbsrv_information(struct irpc_message *msg,
118				   struct smbsrv_information *r)
119{
120	switch (r->in.level) {
121	case SMBSRV_INFO_SESSIONS:
122		return smbsrv_session_information(msg, r);
123	case SMBSRV_INFO_TCONS:
124		return smbsrv_tcon_information(msg, r);
125	}
126
127	return NT_STATUS_OK;
128}
129
130/*
131  initialise irpc management calls on a connection
132*/
133void smbsrv_management_init(struct smbsrv_connection *smb_conn)
134{
135	IRPC_REGISTER(smb_conn->connection->msg_ctx, irpc, SMBSRV_INFORMATION,
136		      smbsrv_information, smb_conn);
137}
138