2 Unix SMB/CIFS implementation.
4 management calls for smb server
6 Copyright (C) Andrew Tridgell 2005
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.
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.
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/>.
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 #include "lib/tsocket/tsocket.h"
31 return a list of open sessions
33 static NTSTATUS
smbsrv_session_information(struct irpc_message
*msg
,
34 struct smbsrv_information
*r
)
36 struct smbsrv_connection
*smb_conn
= talloc_get_type(msg
->private_data
,
37 struct smbsrv_connection
);
38 struct tsocket_address
*client_addr
= smb_conn
->connection
->remote_address
;
39 char *client_addr_string
;
41 struct smbsrv_session
*sess
;
43 /* This is for debugging only! */
44 client_addr_string
= tsocket_address_string(client_addr
, r
);
45 NT_STATUS_HAVE_NO_MEMORY(client_addr_string
);
47 /* count the number of sessions */
48 for (sess
=smb_conn
->sessions
.list
; sess
; sess
=sess
->next
) {
52 r
->out
.info
.sessions
.num_sessions
= count
;
53 r
->out
.info
.sessions
.sessions
= talloc_array(r
, struct smbsrv_session_info
, count
);
54 NT_STATUS_HAVE_NO_MEMORY(r
->out
.info
.sessions
.sessions
);
56 for (sess
=smb_conn
->sessions
.list
; sess
; sess
=sess
->next
) {
57 struct smbsrv_session_info
*info
= &r
->out
.info
.sessions
.sessions
[i
];
59 info
->client_ip
= client_addr_string
;
61 info
->vuid
= sess
->vuid
;
62 info
->account_name
= sess
->session_info
->server_info
->account_name
;
63 info
->domain_name
= sess
->session_info
->server_info
->domain_name
;
65 info
->connect_time
= timeval_to_nttime(&sess
->statistics
.connect_time
);
66 info
->auth_time
= timeval_to_nttime(&sess
->statistics
.auth_time
);
67 info
->last_use_time
= timeval_to_nttime(&sess
->statistics
.last_request_time
);
75 return a list of tree connects
77 static NTSTATUS
smbsrv_tcon_information(struct irpc_message
*msg
,
78 struct smbsrv_information
*r
)
80 struct smbsrv_connection
*smb_conn
= talloc_get_type(msg
->private_data
,
81 struct smbsrv_connection
);
82 struct tsocket_address
*client_addr
= smb_conn
->connection
->remote_address
;
83 char *client_addr_string
;
85 struct smbsrv_tcon
*tcon
;
87 /* This is for debugging only! */
88 client_addr_string
= tsocket_address_string(client_addr
, r
);
89 NT_STATUS_HAVE_NO_MEMORY(client_addr_string
);
91 /* count the number of tcons */
92 for (tcon
=smb_conn
->smb_tcons
.list
; tcon
; tcon
=tcon
->next
) {
96 r
->out
.info
.tcons
.num_tcons
= count
;
97 r
->out
.info
.tcons
.tcons
= talloc_array(r
, struct smbsrv_tcon_info
, count
);
98 NT_STATUS_HAVE_NO_MEMORY(r
->out
.info
.tcons
.tcons
);
100 for (tcon
=smb_conn
->smb_tcons
.list
; tcon
; tcon
=tcon
->next
) {
101 struct smbsrv_tcon_info
*info
= &r
->out
.info
.tcons
.tcons
[i
];
103 info
->client_ip
= client_addr_string
;
105 info
->tid
= tcon
->tid
;
106 info
->share_name
= tcon
->share_name
;
107 info
->connect_time
= timeval_to_nttime(&tcon
->statistics
.connect_time
);
108 info
->last_use_time
= timeval_to_nttime(&tcon
->statistics
.last_request_time
);
116 serve smbserver information via irpc
118 static NTSTATUS
smbsrv_information(struct irpc_message
*msg
,
119 struct smbsrv_information
*r
)
121 switch (r
->in
.level
) {
122 case SMBSRV_INFO_SESSIONS
:
123 return smbsrv_session_information(msg
, r
);
124 case SMBSRV_INFO_TCONS
:
125 return smbsrv_tcon_information(msg
, r
);
132 initialise irpc management calls on a connection
134 void smbsrv_management_init(struct smbsrv_connection
*smb_conn
)
136 IRPC_REGISTER(smb_conn
->connection
->msg_ctx
, irpc
, SMBSRV_INFORMATION
,
137 smbsrv_information
, smb_conn
);