svn commit: samba r6276 - in trunk/source: libsmb utils

vlendec at samba.org vlendec at samba.org
Sun Apr 10 14:45:16 GMT 2005


Author: vlendec
Date: 2005-04-10 14:45:14 +0000 (Sun, 10 Apr 2005)
New Revision: 6276

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6276

Log:
Implement RAP version of enumusers/enumgroups level 0. No, I've not gone mad,
this is to test future changes to enumeration functions...

This can successfully list users from nt4 and w2k3sp1.

Volker

Modified:
   trunk/source/libsmb/clirap2.c
   trunk/source/utils/net_rap.c


Changeset:
Modified: trunk/source/libsmb/clirap2.c
===================================================================
--- trunk/source/libsmb/clirap2.c	2005-04-10 14:44:56 UTC (rev 6275)
+++ trunk/source/libsmb/clirap2.c	2005-04-10 14:45:14 UTC (rev 6276)
@@ -329,6 +329,70 @@
   return res;
 }
 
+int cli_RNetGroupEnum0(struct cli_state *cli,
+		       void (*fn)(const char *, void *),
+		       void *state)
+{
+  char param[WORDSIZE                     /* api number    */
+	    +sizeof(RAP_NetGroupEnum_REQ) /* parm string   */
+	    +sizeof(RAP_GROUP_INFO_L0)    /* return string */
+	    +WORDSIZE                     /* info level    */
+	    +WORDSIZE];                   /* buffer size   */
+  char *p;
+  char *rparam = NULL;
+  char *rdata = NULL; 
+  unsigned int rprcnt, rdrcnt;
+  int res = -1;
+  
+  
+  memset(param, '\0', sizeof(param));
+  p = make_header(param, RAP_WGroupEnum,
+		  RAP_NetGroupEnum_REQ, RAP_GROUP_INFO_L0);
+  PUTWORD(p,0); /* Info level 0 */ /* Hmmm. I *very* much suspect this
+				      is the resume count, at least
+				      that's what smbd believes... */
+  PUTWORD(p,0xFFE0); /* Return buffer size */
+
+  if (cli_api(cli,
+	      param, PTR_DIFF(p,param),8,
+	      NULL, 0, 0xFFE0 /* data area size */,
+	      &rparam, &rprcnt,
+	      &rdata, &rdrcnt)) {
+    res = GETRES(rparam);
+    cli->rap_error = res;
+    if(cli->rap_error == 234) 
+        DEBUG(1,("Not all group names were returned (such as those longer than 21 characters)\n"));
+    else if (cli->rap_error != 0) {
+      DEBUG(1,("NetGroupEnum gave error %d\n", cli->rap_error));
+    }
+  }
+
+  if (rdata) {
+    if (res == 0 || res == ERRmoredata) {
+      int i, converter, count;
+
+      p = rparam + WORDSIZE; /* skip result */
+      GETWORD(p, converter);
+      GETWORD(p, count);
+
+      for (i=0,p=rdata;i<count;i++) {
+	    char groupname[RAP_GROUPNAME_LEN];
+	    GETSTRINGF(p, groupname, RAP_GROUPNAME_LEN);
+	    fn(groupname, cli);
+      }	
+    } else {
+      DEBUG(4,("NetGroupEnum res=%d\n", res));
+    }
+  } else {
+    DEBUG(4,("NetGroupEnum no data returned\n"));
+  }
+    
+  SAFE_FREE(rparam);
+  SAFE_FREE(rdata);
+
+  return res;
+}
+
 int cli_NetGroupDelUser(struct cli_state * cli, const char *group_name, const char *user_name)
 {
   char *rparam = NULL;
@@ -768,6 +832,66 @@
   return res;
 }
 
+int cli_RNetUserEnum0(struct cli_state *cli,
+		      void (*fn)(const char *, void *),
+		      void *state)
+{
+  char param[WORDSIZE                 /* api number    */
+	    +sizeof(RAP_NetUserEnum_REQ) /* parm string   */
+	    +sizeof(RAP_USER_INFO_L0)    /* return string */
+	    +WORDSIZE                 /* info level    */
+	    +WORDSIZE];               /* buffer size   */
+  char *p;
+  char *rparam = NULL;
+  char *rdata = NULL; 
+  unsigned int rprcnt, rdrcnt;
+  int res = -1;
+  
+
+  memset(param, '\0', sizeof(param));
+  p = make_header(param, RAP_WUserEnum,
+		  RAP_NetUserEnum_REQ, RAP_USER_INFO_L0);
+  PUTWORD(p,0); /* Info level 1 */
+  PUTWORD(p,0xFF00); /* Return buffer size */
+
+/* BB Fix handling of large numbers of users to be returned */
+  if (cli_api(cli,
+	      param, PTR_DIFF(p,param),8,
+	      NULL, 0, CLI_BUFFER_SIZE,
+	      &rparam, &rprcnt,
+	      &rdata, &rdrcnt)) {
+    res = GETRES(rparam);
+    cli->rap_error = res;
+    if (cli->rap_error != 0) {
+      DEBUG(1,("NetUserEnum gave error %d\n", cli->rap_error));
+    }
+  }
+  if (rdata) {
+    if (res == 0 || res == ERRmoredata) {
+      int i, converter, count;
+      char username[RAP_USERNAME_LEN];
+
+      p = rparam + WORDSIZE; /* skip result */
+      GETWORD(p, converter);
+      GETWORD(p, count);
+
+      for (i=0,p=rdata;i<count;i++) {
+        GETSTRINGF(p, username, RAP_USERNAME_LEN);
+        fn(username, cli);
+      }
+    } else {
+      DEBUG(4,("NetUserEnum res=%d\n", res));
+    }
+  } else {
+    DEBUG(4,("NetUserEnum no data returned\n"));
+  }
+    
+  SAFE_FREE(rparam);
+  SAFE_FREE(rdata);
+
+  return res;
+}
+
 /****************************************************************************
  call a NetFileClose2 - close open file on another session to server
 ****************************************************************************/

Modified: trunk/source/utils/net_rap.c
===================================================================
--- trunk/source/utils/net_rap.c	2005-04-10 14:44:56 UTC (rev 6275)
+++ trunk/source/utils/net_rap.c	2005-04-10 14:45:14 UTC (rev 6276)
@@ -589,9 +589,7 @@
 	return net_help_user(argc, argv);
 } 
 	
-static void user_fn(const char *user_name, const char *comment,
-		    const char * home_dir, const char * logon_script,
-		    void *state)
+static void user_fn(const char *user_name, void *state)
 {
 	d_printf("%-21.21s\n", user_name);
 }
@@ -696,7 +694,7 @@
 			cli_shutdown(cli);
 			goto done;
 		}
-		ret = cli_RNetUserEnum(cli, user_fn, NULL); 
+		ret = cli_RNetUserEnum0(cli, user_fn, NULL); 
 		cli_shutdown(cli);
 		goto done;
 	}
@@ -721,7 +719,7 @@
 	d_printf("%-21.21s %s\n", group_name, comment);
 }
 
-static void group_fn(const char *group_name, const char *comment, void *state)
+static void group_fn(const char *group_name, void *state)
 {
 	d_printf("%-21.21s\n", group_name);
 }
@@ -787,7 +785,7 @@
 			cli_shutdown(cli);
 			return ret;
 		}
-		ret = cli_RNetGroupEnum(cli, group_fn, NULL); 
+		ret = cli_RNetGroupEnum0(cli, group_fn, NULL); 
 		cli_shutdown(cli);
 		return ret;
 	}
@@ -912,6 +910,12 @@
 	return errmsg_not_implemented();
 }
 
+static void service_fn(const char *service_name, const char *dummy,
+		       void *state)
+{
+	d_printf("%-21.21s\n", service_name);
+}
+
 int net_rap_service(int argc, const char **argv)
 {
 	struct functable func[] = {
@@ -931,7 +935,7 @@
 			d_printf("-----------------------------\n");
 			ret = cli_RNetServiceEnum(cli, long_group_fn, NULL);
 		}
-		ret = cli_RNetServiceEnum(cli, group_fn, NULL); 
+		ret = cli_RNetServiceEnum(cli, service_fn, NULL); 
 		cli_shutdown(cli);
 		return ret;
 	}



More information about the samba-cvs mailing list