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