Move session gathering routine back into session.c so it can be called either
authorJim McDonough <jmcd@samba.org>
Mon, 3 Jun 2002 22:15:46 +0000 (22:15 +0000)
committerJim McDonough <jmcd@samba.org>
Mon, 3 Jun 2002 22:15:46 +0000 (22:15 +0000)
in RAP or RPC environment.
(This used to be commit 3eec0d64c7c4592d4f0d74108fb0be2b7a22bde6)

source3/smbd/lanman.c
source3/smbd/session.c

index bb9aea4c5ac70e4df4f1903cee7ccd79d2761955..b3ee9b57376237e3fd08b8f3be85fa8ea4690829 100644 (file)
@@ -3436,38 +3436,6 @@ static BOOL api_WPrintPortEnum(connection_struct *conn,uint16 vuid, char *param,
   return(True);
 }
 
-struct session_info {
-  char machine[31];
-  char username[24];
-  char clitype[24];
-  int opens;
-  int time;
-};
-
-struct sessions_info {
-  int count;
-  struct session_info *session_list;
-};
-
-static int gather_sessioninfo(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
-{
-  struct sessions_info *sinfo = state;
-  struct session_info *curinfo = NULL;
-  const struct sessionid *sessid = (const struct sessionid *) dbuf.dptr;
-
-  sinfo->count += 1;
-  sinfo->session_list = REALLOC(sinfo->session_list, sinfo->count * sizeof(struct session_info));
-
-  curinfo = &(sinfo->session_list[sinfo->count - 1]);
-
-  safe_strcpy(curinfo->machine, sessid->remote_machine, 
-             sizeof(curinfo->machine));
-  safe_strcpy(curinfo->username, uidtoname(sessid->uid), 
-         sizeof(curinfo->username));
-  DEBUG(7,("gather_sessioninfo session from %s@%s\n", 
-          curinfo->username, curinfo->machine));
-  return 0;
-}
 
 /****************************************************************************
  List open sessions
@@ -3483,8 +3451,8 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
   char *p = skip_string(str2,1);
   int uLevel;
   struct pack_desc desc;
-  struct sessions_info sinfo;
-  int i;
+  struct sessionid *session_list;
+  int i, num_sessions;
 
   memset((char *)&desc,'\0',sizeof(desc));
 
@@ -3498,26 +3466,20 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
   if (strcmp(str1,RAP_NetSessionEnum_REQ) != 0) return False;
   if (uLevel != 2 || strcmp(str2,RAP_SESSION_INFO_L2) != 0) return False;
 
-  sinfo.count = 0;
-  sinfo.session_list = NULL;
-
-  if (!session_traverse(gather_sessioninfo, &sinfo)) {
-    DEBUG(4,("RNetSessionEnum session_traverse failed\n"));
-    return False;
-  }
+  num_sessions = list_sessions(&session_list);
 
   if (mdrcnt > 0) *rdata = REALLOC(*rdata,mdrcnt);
   memset((char *)&desc,'\0',sizeof(desc));
   desc.base = *rdata;
   desc.buflen = mdrcnt;
   desc.format = str2;
-  if (!init_package(&desc,sinfo.count,0)) {
+  if (!init_package(&desc,num_sessions,0)) {
     return False;
   }
 
-  for(i=0; i<sinfo.count; i++) {
-    PACKS(&desc, "z", sinfo.session_list[i].machine);
-    PACKS(&desc, "z", sinfo.session_list[i].username);
+  for(i=0; i<num_sessions; i++) {
+    PACKS(&desc, "z", session_list[i].remote_machine);
+    PACKS(&desc, "z", session_list[i].username);
     PACKI(&desc, "W", 1); /* num conns */
     PACKI(&desc, "W", 0); /* num opens */
     PACKI(&desc, "W", 1); /* num users */
@@ -3533,7 +3495,7 @@ static BOOL api_RNetSessionEnum(connection_struct *conn,uint16 vuid, char *param
   *rparam = REALLOC(*rparam,*rparam_len);
   SSVALS(*rparam,0,desc.errcode);
   SSVAL(*rparam,2,0); /* converter */
-  SSVAL(*rparam,4,sinfo.count); /* count */
+  SSVAL(*rparam,4,num_sessions); /* count */
 
   DEBUG(4,("RNetSessionEnum: errorcode %d\n",desc.errcode));
   return True;
index 05a7b24da284262338f852bd0e384594a5b0d4bf..dade953ec1a4e5ce6beb05a42f89778db2feccbc 100644 (file)
@@ -163,16 +163,54 @@ void session_yield(user_struct *vuser)
        tdb_delete(tdb, key);
 }
 
-BOOL session_traverse(int (*fn)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *), void *state)
+static BOOL session_traverse(int (*fn)(TDB_CONTEXT *, TDB_DATA, TDB_DATA, void *), void *state)
 {
-  if (!tdb) {
-    DEBUG(3, ("No tdb opened\n"));
-    return False;
-  }
+       if (!tdb) {
+               DEBUG(3, ("No tdb opened\n"));
+               return False;
+       }
 
-  tdb_traverse(tdb, fn, state);
-  return True;
+       tdb_traverse(tdb, fn, state);
+       return True;
 }
 
+struct session_list {
+       int count;
+       struct sessionid *sessions;
+};
+
+static int gather_sessioninfo(TDB_CONTEXT *stdb, TDB_DATA kbuf, TDB_DATA dbuf,
+                             void *state)
+{
+       struct session_list *sesslist = (struct session_list *) state;
+       const struct sessionid *current = (const struct sessionid *) dbuf.dptr;
+
+       sesslist->count += 1;
+       sesslist->sessions = REALLOC(sesslist->sessions, sesslist->count * 
+                                     sizeof(struct sessionid));
+
+       memcpy(&sesslist->sessions[sesslist->count - 1], current, 
+              sizeof(struct sessionid));
+       DEBUG(7,("gather_sessioninfo session from %s@%s\n", 
+                current->username, current->remote_machine));
+       return 0;
+}
 
+int list_sessions(struct sessionid **session_list)
+{
+       struct session_list sesslist;
+
+       sesslist.count = 0;
+       sesslist.sessions = NULL;
+       
+       if (!session_traverse(gather_sessioninfo, (void *) &sesslist)) {
+               DEBUG(3, ("Session traverse failed\n"));
+               SAFE_FREE(sesslist.sessions);
+               *session_list = NULL;
+               return 0;
+       }
 
+       *session_list = sesslist.sessions;
+       return sesslist.count;
+}
+