diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/lib/util_status.c | 81 | ||||
-rw-r--r-- | source3/rpc_server/srv_srvsvc.c | 47 |
2 files changed, 121 insertions, 7 deletions
diff --git a/source3/lib/util_status.c b/source3/lib/util_status.c new file mode 100644 index 0000000000..ef6eff43c4 --- /dev/null +++ b/source3/lib/util_status.c @@ -0,0 +1,81 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + Samba connection status utility functions + Copyright (C) Andrew Tridgell 1992-1999 + Copyright (C) Michael Glauche 1999 + + 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" + +extern int DEBUGLEVEL; + +/******************************************************************* +parse the STATUS..LCK file. caller is responsible for freeing *crec. +********************************************************************/ +BOOL get_connection_status(struct connect_record **crec, + uint32 *connection_count) +{ + FILE *f; + pstring fname; + int conn; + + if (crec == NULL || connection_count == NULL) + { + return False; + } + + pstrcpy(fname,lp_lockdir()); + standard_sub_basic(fname); + trim_string(fname,"","/"); + pstrcat(fname,"/STATUS..LCK"); + + f = sys_fopen(fname,"r"); + if (!f) { + DEBUG(0,("Couldn't open status file %s\n",fname)); + return False; + } + + DEBUG(5,("Opened status file %s\n",fname)); + + conn=0; + (*crec) = NULL; + + while (!feof(f)) + { + (*crec) = Realloc((*crec), (conn+1) * sizeof((*crec)[conn])); + if ((*crec) == NULL) + { + DEBUG(0,("Realloc failed in get_connection_status\n")); + return False; + } + if (fread(&(*crec)[conn],sizeof((*crec)[conn]),1,f) != 1) + break; + if ((*crec)[conn].cnum == -1) continue; + if ( (*crec)[conn].magic == 0x280267 && process_exists((*crec)[conn].pid) + ) + { + DEBUG(10,("cnun : %u \n",(*crec)[conn].cnum)); + conn++; + } + } + + fclose(f); + (*connection_count)=conn; + + return True; +} diff --git a/source3/rpc_server/srv_srvsvc.c b/source3/rpc_server/srv_srvsvc.c index 5b43ec0303..834c95615a 100644 --- a/source3/rpc_server/srv_srvsvc.c +++ b/source3/rpc_server/srv_srvsvc.c @@ -509,8 +509,18 @@ static void srv_reply_net_sess_enum(SRV_Q_NET_SESS_ENUM *q_n, ********************************************************************/ static void make_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *stot) { - uint32 num_entries = 0; - (*stot) = 1; + uint32 num_entries = 0; + struct connect_record *crec; + uint32 connection_count; + + if (!get_connection_status(&crec, &connection_count)) + { + (*snum) = 0; + (*stot) = 0; + return; + } + + (*stot) = connection_count; if (ss0 == NULL) { @@ -518,13 +528,13 @@ static void make_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto return; } - DEBUG(5,("make_srv_conn_0_ss0\n")); + DEBUG(0,("make_srv_conn_0_ss0\n")); if (snum) { for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { - make_srv_conn_info0(&(ss0->info_0 [num_entries]), (*stot)); + make_srv_conn_info0(&(ss0->info_0 [num_entries]), (*snum)); /* move on to creating next connection */ /* move on to creating next conn */ @@ -550,6 +560,8 @@ static void make_srv_conn_info_0(SRV_CONN_INFO_0 *ss0, uint32 *snum, uint32 *sto (*stot) = 0; } + + free(crec); } /******************************************************************* @@ -579,8 +591,21 @@ static void make_srv_conn_1_info(CONN_INFO_1 *se1, CONN_INFO_1_STR *str1, ********************************************************************/ static void make_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *stot) { - uint32 num_entries = 0; - (*stot) = 1; + uint32 num_entries = 0; + time_t current_time; + time_t diff; + + struct connect_record *crec; + uint32 connection_count; + + if (!get_connection_status(&crec, &connection_count)) + { + (*snum) = 0; + (*stot) = 0; + return; + } + + (*stot) = connection_count; if (ss1 == NULL) { @@ -588,15 +613,21 @@ static void make_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto return; } + current_time=time(NULL); + DEBUG(5,("make_srv_conn_1_ss1\n")); if (snum) { for (; (*snum) < (*stot) && num_entries < MAX_CONN_ENTRIES; (*snum)++) { + diff = current_time - crec[num_entries].start; make_srv_conn_1_info(&(ss1->info_1 [num_entries]), &(ss1->info_1_str[num_entries]), - (*stot), 0x3, 1, 1, 3,"dummy_user", "IPC$"); + (*snum), 0, 0, 1, diff,uidtoname(crec[num_entries].uid), + crec[num_entries].name); + +/* FIXME : type of connection + number of locked files */ /* move on to creating next connection */ /* move on to creating next conn */ @@ -621,6 +652,8 @@ static void make_srv_conn_info_1(SRV_CONN_INFO_1 *ss1, uint32 *snum, uint32 *sto (*stot) = 0; } + + free(crec); } /******************************************************************* |