patch from Michael Glauche to list connections from STATUS..LCK.
authorLuke Leighton <lkcl@samba.org>
Tue, 17 Aug 1999 23:16:17 +0000 (23:16 +0000)
committerLuke Leighton <lkcl@samba.org>
Tue, 17 Aug 1999 23:16:17 +0000 (23:16 +0000)
(This used to be commit 91a66dd5c3a551691fbf91e782cb6ff16dfea37b)

source3/lib/util_status.c [new file with mode: 0644]
source3/rpc_server/srv_srvsvc.c

diff --git a/source3/lib/util_status.c b/source3/lib/util_status.c
new file mode 100644 (file)
index 0000000..ef6eff4
--- /dev/null
@@ -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;
+}
index 5b43ec03036773cf1bb89269bed46254695d85f2..834c95615a3857fa6581df23a9dbed88f9f20b8f 100644 (file)
@@ -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);
 }
 
 /*******************************************************************