svn commit: samba r6280 - in trunk/source/smbd: .

vlendec at samba.org vlendec at samba.org
Sun Apr 10 15:46:12 GMT 2005


Author: vlendec
Date: 2005-04-10 15:46:01 +0000 (Sun, 10 Apr 2005)
New Revision: 6280

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

Log:
Convert the RAP enum functions to the pdb_search API. Who is using this
nowadays? This looks rather broken, but survives basic tests with 'net'.

Volker

Modified:
   trunk/source/smbd/lanman.c


Changeset:
Modified: trunk/source/smbd/lanman.c
===================================================================
--- trunk/source/smbd/lanman.c	2005-04-10 15:45:46 UTC (rev 6279)
+++ trunk/source/smbd/lanman.c	2005-04-10 15:46:01 UTC (rev 6280)
@@ -27,6 +27,9 @@
 
 #include "includes.h"
 
+extern struct current_user current_user;
+extern userdom_struct current_user_info;
+
 #ifdef CHECK_TYPES
 #undef CHECK_TYPES
 #endif
@@ -1652,9 +1655,10 @@
 	char *str1 = param+2;
 	char *str2 = skip_string(str1,1);
 	char *p = skip_string(str2,1);
-	BOOL ret;
 
-	GROUP_MAP *group_list;
+	struct pdb_search *search;
+	struct samr_displayentry *entries;
+
 	int num_entries;
  
 	if (strcmp(str1,"WrLeh") != 0)
@@ -1672,30 +1676,39 @@
 
 	/* get list of domain groups SID_DOMAIN_GRP=2 */
 	become_root();
-	ret = pdb_enum_group_mapping(SID_NAME_DOM_GRP , &group_list, &num_entries, False);
+	search = pdb_search_groups();
 	unbecome_root();
-	
-	if( !ret ) {
-		DEBUG(3,("api_RNetGroupEnum:failed to get group list"));	
+
+	if (search == NULL) {
+		DEBUG(3,("api_RNetGroupEnum:failed to get group list"));
 		return False;
 	}
 
 	resume_context = SVAL(p,0); 
 	cli_buf_size=SVAL(p+2,0);
-	DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: %d\n", resume_context, cli_buf_size));
+	DEBUG(10,("api_RNetGroupEnum:resume context: %d, client buffer size: "
+		  "%d\n", resume_context, cli_buf_size));
 
+	become_root();
+	num_entries = pdb_search_entries(search, resume_context, 0xffffffff,
+					 &entries);
+	unbecome_root();
+
 	*rdata_len = cli_buf_size;
 	*rdata = SMB_REALLOC_LIMIT(*rdata,*rdata_len);
 
 	p = *rdata;
 
-	for(i=resume_context; i<num_entries; i++) {	
-		char* name=group_list[i].nt_name;
+	for(i=0; i<num_entries; i++) {
+		fstring name;
+		fstrcpy(name, entries[i].account_name);
 		if( ((PTR_DIFF(p,*rdata)+21) <= *rdata_len) ) {
 			/* truncate the name at 21 chars. */
 			memcpy(p, name, 21); 
 			DEBUG(10,("adding entry %d group %s\n", i, p));
-			p += 21; 
+			p += 21;
+			p += 5; /* Both NT4 and W2k3SP1 do padding here.
+				   No idea why... */
 		} else {
 			/* set overflow error */
 			DEBUG(3,("overflow on entry %d group %s\n", i, name));
@@ -1704,6 +1717,8 @@
 		}
 	}
 
+	pdb_search_destroy(search);
+
 	*rdata_len = PTR_DIFF(p,*rdata);
 
 	*rparam_len = 8;
@@ -1711,8 +1726,8 @@
 
   	SSVAL(*rparam, 0, errflags);
   	SSVAL(*rparam, 2, 0);		/* converter word */
-  	SSVAL(*rparam, 4, i-resume_context);	/* is this right?? */
- 	SSVAL(*rparam, 6, num_entries);	/* is this right?? */
+  	SSVAL(*rparam, 4, i);	/* is this right?? */
+ 	SSVAL(*rparam, 6, resume_context+num_entries);	/* is this right?? */
 
 	return(True);
 }
@@ -1831,11 +1846,12 @@
 				 char **rdata,char **rparam,
 				 int *rdata_len,int *rparam_len)
 {
-	SAM_ACCOUNT  *pwd=NULL;
 	int count_sent=0;
-	int count_total=0;
+	int num_users=0;
 	int errflags=0;
-	int resume_context, cli_buf_size;
+	int i, resume_context, cli_buf_size;
+	struct pdb_search *search;
+	struct samr_displayentry *users;
 
 	char *str1 = param+2;
 	char *str2 = skip_string(str1,1);
@@ -1867,49 +1883,47 @@
 
 	p = *rdata;
 
-	/* to get user list enumerations for NetUserEnum in B21 format */
-	pdb_init_sam(&pwd);
-	
-	/* Open the passgrp file - not for update. */
 	become_root();
-	if(!pdb_setsampwent(False, 0)) {
+	search = pdb_search_users(ACB_NORMAL);
+	unbecome_root();
+	if (search == NULL) {
 		DEBUG(0, ("api_RNetUserEnum:unable to open sam database.\n"));
-		unbecome_root();
 		return False;
 	}
+
+	become_root();
+	num_users = pdb_search_entries(search, resume_context, 0xffffffff,
+				       &users);
+	unbecome_root();
+
 	errflags=NERR_Success;
 
-	while ( pdb_getsampwent(pwd) ) {
-		const char *name=pdb_get_username(pwd);	
-		if ((name) && (*(name+strlen(name)-1)!='$')) { 
-			count_total++;
-			if(count_total>=resume_context) {
-				if( ((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)  ) {
-					pstrcpy(p,name); 
-					DEBUG(10,("api_RNetUserEnum:adding entry %d username %s\n",count_sent,p));
-					p += 21; 
-					count_sent++; 
-				} else {
-					/* set overflow error */
-					DEBUG(10,("api_RNetUserEnum:overflow on entry %d username %s\n",count_sent,name));
-					errflags=234;
-					break;
-				}
-			}
-		}	
-	} ;
+	for (i=0; i<num_users; i++) {
+		const char *name = users[i].account_name;
+		
+		if(((PTR_DIFF(p,*rdata)+21)<=*rdata_len)&&(strlen(name)<=21)) {
+			pstrcpy(p,name); 
+			DEBUG(10,("api_RNetUserEnum:adding entry %d username "
+				  "%s\n",count_sent,p));
+			p += 21; 
+			count_sent++; 
+		} else {
+			/* set overflow error */
+			DEBUG(10,("api_RNetUserEnum:overflow on entry %d "
+				  "username %s\n",count_sent,name));
+			errflags=234;
+			break;
+		}
+	}
 
-	pdb_endsampwent();
-	unbecome_root();
+	pdb_search_destroy(search);
 
-	pdb_free_sam(&pwd);
-
 	*rdata_len = PTR_DIFF(p,*rdata);
 
 	SSVAL(*rparam,0,errflags);
 	SSVAL(*rparam,2,0);	      /* converter word */
 	SSVAL(*rparam,4,count_sent);  /* is this right?? */
-	SSVAL(*rparam,6,count_total); /* is this right?? */
+	SSVAL(*rparam,6,num_users); /* is this right?? */
 
 	return True;
 }
@@ -2116,7 +2130,6 @@
 	int snum;
 	fstring sharename;
 	int errcode;
-	extern struct current_user current_user;
 	WERROR werr = WERR_OK;
 
 	if(!rap_to_pjobid(SVAL(p,0), sharename, &jobid))
@@ -2183,7 +2196,6 @@
 	int errcode = NERR_notsupported;
 	int snum;
 	WERROR werr = WERR_OK;
-	extern struct current_user current_user;
 
 	/* check it's a supported varient */
 	if (!(strcsequal(str1,"z") && strcsequal(str2,"")))
@@ -2435,7 +2447,6 @@
   char *str2 = skip_string(str1,1);
   char *p = skip_string(str2,1);
   char *p2;
-  extern userdom_struct current_user_info;
   int level = SVAL(p,0);
 
   DEBUG(4,("NetWkstaGetInfo level %d\n",level));



More information about the samba-cvs mailing list