r8577: added management calls to list current tree connects
authorAndrew Tridgell <tridge@samba.org>
Tue, 19 Jul 2005 04:26:58 +0000 (04:26 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:29:40 +0000 (13:29 -0500)
(This used to be commit 658befc1e4df44bee1f365a730951001f0f36640)

source4/librpc/idl/irpc.idl
source4/scripting/bin/smbstatus
source4/scripting/libjs/management.js
source4/smb_server/conn.c
source4/smb_server/management.c
source4/smb_server/smb_server.h

index 4c4a8810feec141c3ba569e4cf29b71fad4ac529..3ecbc11d589128d3bb9fd93c372b3d107110069b 100644 (file)
@@ -52,7 +52,8 @@
          management calls for the smb server
        ******************************************************/
        typedef [v1_enum] enum {
-               SMBSRV_INFO_SESSIONS
+               SMBSRV_INFO_SESSIONS,
+               SMBSRV_INFO_TREES
        } smbsrv_info_level;
 
        typedef struct {
                [size_is(num_sessions)] smbsrv_session_info *sessions;
        } smbsrv_sessions;
 
+       typedef struct {
+               uint16 tid;
+               astring share_name;
+               astring client_ip;
+               NTTIME  connect_time;
+       } smbsrv_tree_info;
+
+       typedef struct {
+               uint32 num_trees;
+               [size_is(num_trees)] smbsrv_tree_info *trees;
+       } smbsrv_trees;
+
        typedef union {
                [case(SMBSRV_INFO_SESSIONS)] smbsrv_sessions sessions;
+               [case(SMBSRV_INFO_TREES)]    smbsrv_trees    trees;
        } smbsrv_info;
 
        void smbsrv_information(
index fd3009012b5d76681c549705715ad9891bc695f9..9f7566a6420e488ebfb5364e05ef6fc42d6fab8d 100755 (executable)
@@ -21,6 +21,17 @@ if (ok == false) {
 
 
 var sessions = smbsrv_sessions();
+if (sessions == undefined) {
+       println("No sessions");
+       exit(0);
+}
 printVars(sessions);
 
+var trees = smbsrv_trees();
+if (trees == undefined) {
+       println("No trees");
+       exit(0);
+}
+printVars(trees);
+
 return 0;
index 371ddc026b7512356e5fc4f705e4e854749b760d..d989541661c1b7e688a5f379618ed73153640937 100644 (file)
@@ -4,6 +4,7 @@
        Released under the GNU GPL v2 or later
 */
 
+
 /*
   return a list of current sessions 
 */
@@ -12,11 +13,16 @@ function smbsrv_sessions()
        var conn = new Object();
        var irpc = irpc_init();
        status = irpc_connect(conn, "smb_server");
-       assert(status.is_ok == true);
+       if (status.is_ok != true) {
+               return undefined;
+       }
 
        var io = irpcObj();
        io.input.level = irpc.SMBSRV_INFO_SESSIONS;
        status = irpc.smbsrv_information(conn, io);
+       if (status.is_ok != true) {
+               return undefined;
+       }
 
        /* gather the results into a single array */
        var i, count=0, ret = new Object();
@@ -31,3 +37,36 @@ function smbsrv_sessions()
        ret.length = count;
        return ret;
 }
+
+/*
+  return a list of current tree connects
+*/
+function smbsrv_trees()
+{
+       var conn = new Object();
+       var irpc = irpc_init();
+       status = irpc_connect(conn, "smb_server");
+       if (status.is_ok != true) {
+               return undefined;
+       }
+
+       var io = irpcObj();
+       io.input.level = irpc.SMBSRV_INFO_TREES;
+       status = irpc.smbsrv_information(conn, io);
+       if (status.is_ok != true) {
+               return undefined;
+       }
+
+       /* gather the results into a single array */
+       var i, count=0, ret = new Object();
+       for (i=0;i<io.results.length;i++) {
+               var trees = io.results[i].info.trees.trees;
+               var j;
+               for (j=0;j<trees.length;j++) {
+                       ret[count] = trees[j];
+                       count++;
+               }
+       }
+       ret.length = count;
+       return ret;
+}
index dfc310a1610e1c61dd049126110f870d7f561118..a9cd71e801f725fdc31ac5933cc2d245808efeb6 100644 (file)
@@ -81,6 +81,7 @@ struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn)
 
        tcon->tid = i;
        tcon->smb_conn = smb_conn;
+       tcon->connect_time = timeval_current();
 
        talloc_set_destructor(tcon, smbsrv_tcon_destructor);
 
index 828281836003fcecc4a1d6058136d0fc4e2f6bfd..234adac4148f6a16d02dc569076f9b27fe101efb 100644 (file)
@@ -59,6 +59,37 @@ static NTSTATUS smbsrv_session_information(struct irpc_message *msg,
        return NT_STATUS_OK;
 }
 
+/*
+  return a list of tree connects
+*/
+static NTSTATUS smbsrv_tree_information(struct irpc_message *msg, 
+                                          struct smbsrv_information *r)
+{
+       struct smbsrv_connection *smb_conn = talloc_get_type(msg->private, struct smbsrv_connection);
+       int i=0, count=0;
+       struct smbsrv_tcon *tcon;
+
+       /* count the number of tcons */
+       for (tcon=smb_conn->tree.tcons; tcon; tcon=tcon->next) {
+               count++;
+       }
+
+       r->out.info.trees.num_trees = count;
+       r->out.info.trees.trees = talloc_array(r, struct smbsrv_tree_info, count);
+       NT_STATUS_HAVE_NO_MEMORY(r->out.info.trees.trees);
+
+       for (tcon=smb_conn->tree.tcons; tcon; tcon=tcon->next) {
+               struct smbsrv_tree_info *info = &r->out.info.trees.trees[i];
+               info->tid          = tcon->tid;
+               info->share_name   = lp_servicename(tcon->service);
+               info->connect_time = timeval_to_nttime(&tcon->connect_time);
+               info->client_ip    = socket_get_peer_addr(smb_conn->connection->socket, r);
+               i++;
+       }       
+
+       return NT_STATUS_OK;
+}
+
 /*
   serve smbserver information via irpc
 */
@@ -68,6 +99,8 @@ static NTSTATUS smbsrv_information(struct irpc_message *msg,
        switch (r->in.level) {
        case SMBSRV_INFO_SESSIONS:
                return smbsrv_session_information(msg, r);
+       case SMBSRV_INFO_TREES:
+               return smbsrv_tree_information(msg, r);
        }
 
        return NT_STATUS_OK;
index df49825e0e26ca2121eda2181131ebe763f37c05..819a70cbae02749340105e6329c71c1127771e5b 100644 (file)
@@ -79,6 +79,8 @@ struct smbsrv_tcon {
 
        /* the reported device type */
        char *dev_type;
+
+       struct timeval connect_time;
 };
 
 /* a set of flags to control handling of request structures */