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"
30 return a list of open sessions
32 static NTSTATUS
smbsrv_session_information(struct irpc_message
*msg
,
33 struct smbsrv_information
*r
)
35 struct smbsrv_connection
*smb_conn
= talloc_get_type(msg
->private_data
,
36 struct smbsrv_connection
);
38 struct smbsrv_session
*sess
;
40 /* count the number of sessions */
41 for (sess
=smb_conn
->sessions
.list
; sess
; sess
=sess
->next
) {
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
);
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
);
55 info
->client_ip
= client_addr
->addr
;
57 info
->client_ip
= NULL
;
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
;
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
);
74 return a list of tree connects
76 static NTSTATUS
smbsrv_tcon_information(struct irpc_message
*msg
,
77 struct smbsrv_information
*r
)
79 struct smbsrv_connection
*smb_conn
= talloc_get_type(msg
->private_data
,
80 struct smbsrv_connection
);
82 struct smbsrv_tcon
*tcon
;
84 /* count the number of tcons */
85 for (tcon
=smb_conn
->smb_tcons
.list
; tcon
; tcon
=tcon
->next
) {
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
);
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
);
99 info
->client_ip
= client_addr
->addr
;
101 info
->client_ip
= NULL
;
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
);
115 serve smbserver information via irpc
117 static NTSTATUS
smbsrv_information(struct irpc_message
*msg
,
118 struct smbsrv_information
*r
)
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
);
131 initialise irpc management calls on a connection
133 void smbsrv_management_init(struct smbsrv_connection
*smb_conn
)
135 IRPC_REGISTER(smb_conn
->connection
->msg_ctx
, irpc
, SMBSRV_INFORMATION
,
136 smbsrv_information
, smb_conn
);