SAM updates...

Stefan (metze) Metzmacher metze at metzemix.de
Thu Aug 29 14:04:01 GMT 2002


Hi Jelmer, Andrew, kai,

here's a patch witch adds api.c plugin.c

and fix sam.h and interface.c  to get the parameters right ( const all 
parameters witch doesn't return anything)

and add api.c plugin.c to Makefile.in

there're some warnings in interface.c

It also move all 'user' -> 'account'
and 'USER' -> 'ACCOUNT'   but not NT_USER_TOKEN

move plaintext_pw to char*

const fixes
and a lot of format and typo fixes...

Add a sample SAM module sam_skel.so ...

Remove the ^M  from api.c and plugin.c  and sam_skel.c ..

and all files compile :-) (a few with a few warnings but....)

Jelmer please add lp_sam_backend() to loadparm.c and testparm.c



metze
-----------------------------------------------------------------------------
Stefan "metze" Metzmacher <metze at metzemix.de>
-------------- next part --------------
diff -Npur --exclude=CVS HEAD/source/sam/account.c HEAD-fix/source/sam/account.c
--- HEAD/source/sam/account.c	Wed Aug 28 18:41:23 2002
+++ HEAD-fix/source/sam/account.c	Thu Aug 29 00:42:59 2002
@@ -27,65 +27,84 @@
 #define DBGC_CLASS DBGC_SAM
 
 /************************************************************
- Fill the SAM_USER_HANDLE with default values.
+ Fill the SAM_ACCOUNT_HANDLE with default values.
  ***********************************************************/
 
-static void sam_fill_default_user(SAM_USER_HANDLE *user)
+static void sam_fill_default_account(SAM_ACCOUNT_HANDLE *account)
 {
-	ZERO_STRUCT(user->private); /* Don't touch the talloc context */
+	ZERO_STRUCT(account->private); /* Don't touch the talloc context */
 
         /* Don't change these timestamp settings without a good reason.
            They are important for NT member server compatibility. */
 
-	user->private.init_flag		    = FLAG_SAM_UNINIT;
+	account->private.init_flag		    = FLAG_SAM_UNINIT;
 
 	/* FIXME: We should actually call get_nt_time_max() or sthng 
 	 * here */
-	unix_to_nt_time(&(user->private.logoff_time),get_time_t_max());
-	unix_to_nt_time(&(user->private.kickoff_time),get_time_t_max());
-	unix_to_nt_time(&(user->private.pass_must_change_time),get_time_t_max());
-	user->private.unknown_1 = 0x00ffffff; 	/* don't know */
-	user->private.logon_divs = 168; 	/* hours per week */
-	user->private.hours_len = 21; 		/* 21 times 8 bits = 168 */
-	memset(user->private.hours, 0xff, user->private.hours_len); /* available at all hours */
-	user->private.unknown_2 = 0x00000000; /* don't know */
-	user->private.unknown_3 = 0x000004ec; /* don't know */
+	unix_to_nt_time(&(account->private.logoff_time),get_time_t_max());
+	unix_to_nt_time(&(account->private.kickoff_time),get_time_t_max());
+	unix_to_nt_time(&(account->private.pass_must_change_time),get_time_t_max());
+	account->private.unknown_1 = 0x00ffffff; 	/* don't know */
+	account->private.logon_divs = 168; 	/* hours per week */
+	account->private.hours_len = 21; 		/* 21 times 8 bits = 168 */
+	memset(account->private.hours, 0xff, account->private.hours_len); /* available at all hours */
+	account->private.unknown_2 = 0x00000000; /* don't know */
+	account->private.unknown_3 = 0x000004ec; /* don't know */
+	
+	account->private.account_name = "";
+	account->private.full_name = "";
+	account->private.unix_home_dir = "";
+	account->private.home_dir = "";
+	account->private.dir_drive = "";
+	account->private.logon_script = "";
+	account->private.profile_path = "";
+	account->private.acct_desc = "";
+	account->private.workstations = "";
+	account->private.unknown_str = "";
+	account->private.munged_dial = "";
+
+	account->private.plaintext_pw = NULL;
 }	
 
-static void destroy_sam_talloc(SAM_USER_HANDLE **user) 
+static void destroy_sam_talloc(SAM_ACCOUNT_HANDLE **account) 
 {
-	if (*user) {
-		talloc_destroy((*user)->mem_ctx);
-		*user = NULL;
+	if (*account) {
+		data_blob_clear_free(&((*account)->private.lm_pw));
+		data_blob_clear_free(&((*account)->private.nt_pw));
+		if((*account)->private.plaintext_pw!=NULL)
+			memset((*account)->private.plaintext_pw,'\0',strlen((*account)->private.plaintext_pw));
+
+		talloc_destroy((*account)->mem_ctx);
+		*account = NULL;
 	}
 }
 
 
 /**********************************************************************
- Alloc memory and initialises a SAM_USER_HANDLE on supplied mem_ctx.
+ Alloc memory and initialises a SAM_ACCOUNT_HANDLE on supplied mem_ctx.
 ***********************************************************************/
 
-NTSTATUS sam_init_user_talloc(TALLOC_CTX *mem_ctx, SAM_USER_HANDLE **user)
+NTSTATUS sam_init_account_talloc(TALLOC_CTX *mem_ctx, SAM_ACCOUNT_HANDLE **account)
 {
-	SMB_ASSERT(*user != NULL);
+	SMB_ASSERT(*account != NULL);
 
 	if (!mem_ctx) {
-		DEBUG(0,("sam_init_user_talloc: mem_ctx was NULL!\n"));
+		DEBUG(0,("sam_init_account_talloc: mem_ctx was NULL!\n"));
 		return NT_STATUS_UNSUCCESSFUL;
 	}
 
-	*user=(SAM_USER_HANDLE *)talloc(mem_ctx, sizeof(SAM_USER_HANDLE));
+	*account=(SAM_ACCOUNT_HANDLE *)talloc(mem_ctx, sizeof(SAM_ACCOUNT_HANDLE));
 
-	if (*user==NULL) {
-		DEBUG(0,("sam_init_user_talloc: error while allocating memory\n"));
+	if (*account==NULL) {
+		DEBUG(0,("sam_init_account_talloc: error while allocating memory\n"));
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	(*user)->mem_ctx = mem_ctx;
+	(*account)->mem_ctx = mem_ctx;
 
-	(*user)->free_fn = NULL;
+	(*account)->free_fn = NULL;
 
-	sam_fill_default_user(*user);
+	sam_fill_default_account(*account);
 	
 	return NT_STATUS_OK;
 }
@@ -95,77 +114,78 @@ NTSTATUS sam_init_user_talloc(TALLOC_CTX
  Alloc memory and initialises a struct sam_passwd.
  ************************************************************/
 
-NTSTATUS sam_init_user(SAM_USER_HANDLE **user)
+NTSTATUS sam_init_account(SAM_ACCOUNT_HANDLE **account)
 {
 	TALLOC_CTX *mem_ctx;
 	NTSTATUS nt_status;
 	
-	mem_ctx = talloc_init_named("passdb internal SAM_USER_HANDLE allocation");
+	mem_ctx = talloc_init_named("passdb internal SAM_ACCOUNT_HANDLE allocation");
 
 	if (!mem_ctx) {
-		DEBUG(0,("sam_init_user: error while doing talloc_init()\n"));
+		DEBUG(0,("sam_init_account: error while doing talloc_init()\n"));
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = sam_init_user_talloc(mem_ctx, user))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_init_account_talloc(mem_ctx, account))) {
 		talloc_destroy(mem_ctx);
 		return nt_status;
 	}
 	
-	(*user)->free_fn = destroy_sam_talloc;
+	(*account)->free_fn = destroy_sam_talloc;
 
 	return NT_STATUS_OK;
 }
 
 /**
- * Free the contents of the SAM_USER_HANDLE, but not the structure.
+ * Free the contents of the SAM_ACCOUNT_HANDLE, but not the structure.
  *
  * Also wipes the LM and NT hashes and plaintext password from 
  * memory.
  *
- * @param user SAM_USER_HANDLE to free members of.
+ * @param account SAM_ACCOUNT_HANDLE to free members of.
  **/
 
-static void sam_free_user_contents(SAM_USER_HANDLE *user)
+static void sam_free_account_contents(SAM_ACCOUNT_HANDLE *account)
 {
 
 	/* Kill off sensitive data.  Free()ed by the
 	   talloc mechinism */
 
-	data_blob_clear_free(&(user->private.lm_pw));
-	data_blob_clear_free(&(user->private.nt_pw));
-	data_blob_clear_free(&(user->private.plaintext_pw));
+	data_blob_clear_free(&(account->private.lm_pw));
+	data_blob_clear_free(&(account->private.nt_pw));
+	if (account->private.plaintext_pw)
+		memset(account->private.plaintext_pw,'\0',strlen(account->private.plaintext_pw));
 }
 
 
 /************************************************************
- Reset the SAM_USER_HANDLE and free the NT/LM hashes.
+ Reset the SAM_ACCOUNT_HANDLE and free the NT/LM hashes.
  ***********************************************************/
 
-NTSTATUS sam_reset_sam(SAM_USER_HANDLE *user)
+NTSTATUS sam_reset_sam(SAM_ACCOUNT_HANDLE *account)
 {
-	SMB_ASSERT(user != NULL);
+	SMB_ASSERT(account != NULL);
 	
-	sam_free_user_contents(user);
+	sam_free_account_contents(account);
 
-	sam_fill_default_user(user);
+	sam_fill_default_account(account);
 
 	return NT_STATUS_OK;
 }
 
 
 /************************************************************
- Free the SAM_USER_HANDLE and the member pointers.
+ Free the SAM_ACCOUNT_HANDLE and the member pointers.
  ***********************************************************/
 
-NTSTATUS sam_free_user(SAM_USER_HANDLE **user)
+NTSTATUS sam_free_account(SAM_ACCOUNT_HANDLE **account)
 {
-	SMB_ASSERT(*user != NULL);
+	SMB_ASSERT(*account != NULL);
 
-	sam_free_user_contents(*user);
+	sam_free_account_contents(*account);
 	
-	if ((*user)->free_fn) {
-		(*user)->free_fn(user);
+	if ((*account)->free_fn) {
+		(*account)->free_fn(account);
 	}
 
 	return NT_STATUS_OK;	
diff -Npur --exclude=CVS HEAD/source/sam/api.c HEAD-fix/source/sam/api.c
--- HEAD/source/sam/api.c	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/source/sam/api.c	Thu Aug 29 00:30:54 2002
@@ -0,0 +1,311 @@
+/* 
+   Unix SMB/CIFS implementation.
+   SAM interface API.
+
	
+   Copyright (C) Stefan (metze) Metzmacher		2002
+      
+   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"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_SAM
+
+/* this function should be used by the rest of SAMBA --metze */
+
+/* General API */
+
+NTSTATUS sam_get_sec_desc(const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_sec_desc(sam_context, access_token, sid, sd);
+}
+
+NTSTATUS sam_set_sec_desc(const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_set_sec_desc(sam_context, access_token, sid, sd);
+}
+
+NTSTATUS sam_lookup_sid(const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_lookup_sid(sam_context, access_token, sid, name, type);
+}
+
+NTSTATUS sam_lookup_name(const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid,  uint32 *type)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_lookup_name(sam_context, access_token, domain, name, sid, type);
+}
+
+/* Domain API */
+
+NTSTATUS sam_update_domain(const SAM_DOMAIN_HANDLE *domain)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_update_domain(sam_context, domain);
+}
+
+NTSTATUS sam_enum_domains(const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char **domain_names)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_enum_domains(sam_context, access_token, domain_count, domains, domain_names);
+}
+
+NTSTATUS sam_lookup_domain(const NT_USER_TOKEN * access_token, const char *domain, DOM_SID **domainsid)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_lookup_domain(sam_context, access_token, domain, domainsid);
+}
+
+NTSTATUS sam_get_domain_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_domain_by_sid(sam_context, access_token, access_desired, domainsid, domain);
+}
+
+/* Account API */
+
+NTSTATUS sam_create_account(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_create_account(sam_context, access_token, access_desired, domainsid, account);
+}
+
+NTSTATUS sam_add_account(const DOM_SID *domainsid, const SAM_ACCOUNT_HANDLE *account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_add_account(sam_context, domainsid, account);
+}
+
+NTSTATUS sam_update_account(const SAM_ACCOUNT_HANDLE *account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_update_account(sam_context, account);
+}
+
+NTSTATUS sam_delete_account(const SAM_ACCOUNT_HANDLE *account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_delete_account(sam_context, account);
+}
+
+NTSTATUS sam_enum_accounts(const NT_USER_TOKEN *access_token, const DOM_SID *domain, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_enum_accounts(sam_context, access_token, domain, account_count, accounts);
+}
+
+NTSTATUS sam_get_account_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_account_by_sid(sam_context, access_token, access_desired, accountsid, account);
+}
+
+NTSTATUS sam_get_account_by_name(const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_ACCOUNT_HANDLE **account)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_account_by_name(sam_context, access_token, access_desired, domain, name, account);
+}
+
+/* Group API */
+
+NTSTATUS sam_add_group(const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_add_group(sam_context, domainsid, group);
+}
+
+NTSTATUS sam_update_group(const SAM_GROUP_HANDLE *group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_update_group(sam_context, group);
+}
+
+NTSTATUS sam_delete_group(const SAM_GROUP_HANDLE *group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_delete_group(sam_context, group);
+}
+
+NTSTATUS sam_enum_groups(const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_enum_groups(sam_context, access_token, domainsid, type, groups_count, groups);
+}
+
+NTSTATUS sam_get_group_by_sid(const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_group_by_sid(sam_context, access_token, access_desired, groupsid, group);
+}
+
+NTSTATUS sam_get_group_by_name(const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_group_by_name(sam_context, access_token, access_desired, domain, name, group);
+}
+
+NTSTATUS sam_add_member_to_group(const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_add_member_to_group(sam_context, group, member);
+}
+
+NTSTATUS sam_delete_member_from_group(const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_delete_member_from_group(sam_context, group, member);
+}
+
+NTSTATUS sam_enum_groupmembers(const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_enum_groupmembers(sam_context, group, members_count, members);
+}
+
+NTSTATUS sam_get_groups_of_account(const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+{
+	SAM_CONTEXT *sam_context = sam_get_static_context(False);
+
+	if (!sam_context) {
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return sam_context->sam_get_groups_of_account(sam_context, account, type, group_count, groups);
+}
+
diff -Npur --exclude=CVS HEAD/source/sam/get_set_account.c HEAD-fix/source/sam/get_set_account.c
--- HEAD/source/sam/get_set_account.c	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/source/sam/get_set_account.c	Thu Aug 29 00:58:16 2002
@@ -0,0 +1,906 @@
+/* 
+   Unix SMB/CIFS implementation.
+   SAM_ACCOUNT_HANDLE access routines
+   Copyright (C) Andrew Bartlett			2002
+   Copyright (C) Stefan (metze) Metzmacher		2002
+   Copyright (C) Jelmer Vernooij 			2002
+      
+   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"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_SAM
+
+NTSTATUS sam_get_account_domain_sid(const SAM_ACCOUNT_HANDLE *sampass, DOM_SID **sid)
+{
+	NTSTATUS status;
+	SAM_DOMAIN_HANDLE *domain;
+	if (!sampass || !sid) return NT_STATUS_UNSUCCESSFUL;
+
+	if (!NT_STATUS_IS_OK(status = sam_get_account_domain(sampass, &domain))){
+		DEBUG(0, ("sam_get_account_domain_sid: Can't get domain for account\n"));
+		return status;
+	}
+
+	return sam_get_domain_sid(domain, sid);
+}
+
+NTSTATUS sam_get_account_domain_name(const SAM_ACCOUNT_HANDLE *sampass, char **domain_name)
+{
+	NTSTATUS status;
+	SAM_DOMAIN_HANDLE *domain;
+	if (!sampass || !domain_name) return NT_STATUS_UNSUCCESSFUL;
+
+	if (!NT_STATUS_IS_OK(status = sam_get_account_domain(sampass, &domain))){
+		DEBUG(0, ("sam_get_account_domain_name: Can't get domain for account\n"));
+		return status;
+	}
+
+	return sam_get_domain_name(domain, domain_name);
+}
+
+NTSTATUS sam_get_account_acct_ctrl(const SAM_ACCOUNT_HANDLE *sampass, uint16 *acct_ctrl)
+{
+	if(!sampass || !acct_ctrl) return NT_STATUS_UNSUCCESSFUL;
+
+	*acct_ctrl = sampass->private.acct_ctrl;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_logon_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *logon_time)
+{
+	if(!sampass || !logon_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*logon_time = sampass->private.logon_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_logoff_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *logoff_time)
+{
+	if(!sampass || !logoff_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*logoff_time = sampass->private.logoff_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_kickoff_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *kickoff_time)
+{
+	if (!sampass || !kickoff_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*kickoff_time = sampass->private.kickoff_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_pass_last_set_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_last_set_time)
+{
+	if (!sampass || !pass_last_set_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*pass_last_set_time = sampass->private.pass_last_set_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_pass_can_change_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_can_change_time)
+{
+	if (!sampass || !pass_can_change_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*pass_can_change_time = sampass->private.pass_can_change_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_pass_must_change_time(const SAM_ACCOUNT_HANDLE *sampass, NTTIME *pass_must_change_time)
+{
+	if (!sampass || !pass_must_change_time) return NT_STATUS_UNSUCCESSFUL;
+
+	*pass_must_change_time = sampass->private.pass_must_change_time;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_logon_divs(const SAM_ACCOUNT_HANDLE *sampass, uint16 *logon_divs)
+{
+	if (!sampass || !logon_divs) return NT_STATUS_UNSUCCESSFUL;
+
+	*logon_divs = sampass->private.logon_divs;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_hours_len(const SAM_ACCOUNT_HANDLE *sampass, uint32 *hours_len)
+{
+	if (!sampass || !hours_len) return NT_STATUS_UNSUCCESSFUL;
+
+	*hours_len = sampass->private.hours_len;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_hours(const SAM_ACCOUNT_HANDLE *sampass, uint8 **hours)
+{
+	if (!sampass || !hours) return NT_STATUS_UNSUCCESSFUL;
+
+	*hours = sampass->private.hours;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_nt_pwd(const SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB *nt_pwd)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	SMB_ASSERT((!sampass->private.nt_pw.data) 
+		   || sampass->private.nt_pw.length == NT_HASH_LEN);
+
+	*nt_pwd = sampass->private.nt_pw;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_lm_pwd(const SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB *lm_pwd)
+{ 
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	SMB_ASSERT((!sampass->private.lm_pw.data) 
+		   || sampass->private.lm_pw.length == LM_HASH_LEN);
+
+	*lm_pwd = sampass->private.lm_pw;
+
+	return NT_STATUS_OK;
+}
+
+/* Return the plaintext password if known.  Most of the time
+   it isn't, so don't assume anything magic about this function.
+   
+   Used to pass the plaintext to sam backends that might 
+   want to store more than just the NTLM hashes.
+*/
+
+NTSTATUS sam_get_account_plaintext_pwd(const SAM_ACCOUNT_HANDLE *sampass, char **plain_pwd)
+{
+	if (!sampass || !plain_pwd) return NT_STATUS_UNSUCCESSFUL;
+
+	*plain_pwd = sampass->private.plaintext_pw;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_sid(const SAM_ACCOUNT_HANDLE *sampass, DOM_SID **sid)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*sid = &(sampass->private.account_sid);
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_pgroup(const SAM_ACCOUNT_HANDLE *sampass, DOM_SID **sid)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*sid = &(sampass->private.group_sid);
+
+	return NT_STATUS_OK;
+}
+
+/**
+ * Get flags showing what is initalised in the SAM_ACCOUNT_HANDLE
+ * @param sampass the SAM_ACCOUNT_HANDLE in question
+ * @return the flags indicating the members initialised in the struct.
+ **/
+ 
+NTSTATUS sam_get_account_init_flag(const SAM_ACCOUNT_HANDLE *sampass, uint32 *initflag)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*initflag = sampass->private.init_flag;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_name(const SAM_ACCOUNT_HANDLE *sampass, char **account_name)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*account_name = sampass->private.account_name;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_domain(const SAM_ACCOUNT_HANDLE *sampass, SAM_DOMAIN_HANDLE **domain)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*domain = sampass->private.domain;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_fullname(const SAM_ACCOUNT_HANDLE *sampass, char **fullname)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*fullname = sampass->private.full_name;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_homedir(const SAM_ACCOUNT_HANDLE *sampass, char **homedir)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*homedir = sampass->private.home_dir;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_unix_home_dir(const SAM_ACCOUNT_HANDLE *sampass, char **uhomedir)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*uhomedir = sampass->private.unix_home_dir;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_dir_drive(const SAM_ACCOUNT_HANDLE *sampass, char **dirdrive)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*dirdrive = sampass->private.dir_drive;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_logon_script(const SAM_ACCOUNT_HANDLE *sampass, char **logon_script)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*logon_script = sampass->private.logon_script;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_profile_path(const SAM_ACCOUNT_HANDLE *sampass, char **profile_path)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*profile_path = sampass->private.profile_path;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_description(const SAM_ACCOUNT_HANDLE *sampass, char **description)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*description = sampass->private.acct_desc;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_workstations(const SAM_ACCOUNT_HANDLE *sampass, char **workstations)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*workstations = sampass->private.workstations;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_unknown_str(const SAM_ACCOUNT_HANDLE *sampass, char **unknown_str)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*unknown_str = sampass->private.unknown_str;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_munged_dial(const SAM_ACCOUNT_HANDLE *sampass, char **munged_dial)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	*munged_dial = sampass->private.munged_dial;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_unknown_1(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown1)
+{
+	if (!sampass || !unknown1) return NT_STATUS_UNSUCCESSFUL;
+
+	*unknown1 = sampass->private.unknown_1;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_unknown_2(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown2)
+{
+	if (!sampass || !unknown2) return NT_STATUS_UNSUCCESSFUL;
+
+	*unknown2 = sampass->private.unknown_2;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_get_account_unknown_3(const SAM_ACCOUNT_HANDLE *sampass, uint32 *unknown3)
+{
+	if (!sampass || !unknown3) return NT_STATUS_UNSUCCESSFUL;
+
+	*unknown3 = sampass->private.unknown_3;
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Collection of set...() functions for SAM_ACCOUNT_HANDLE_INFO.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_acct_ctrl(SAM_ACCOUNT_HANDLE *sampass, uint16 flags)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+		
+	sampass->private.acct_ctrl = flags;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_logon_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.logon_time = mytime;
+
+	if (store)
+		sam_set_account_init_flag(sampass, FLAG_SAM_LOGONTIME); 
+
+	return NT_STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS sam_set_account_logoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.logoff_time = mytime;
+
+	if (store)
+		sam_set_account_init_flag(sampass, FLAG_SAM_LOGOFFTIME); 
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_kickoff_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.kickoff_time = mytime;
+
+	if (store)
+		sam_set_account_init_flag(sampass, FLAG_SAM_KICKOFFTIME); 
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_pass_can_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.pass_can_change_time = mytime;
+
+	if (store)
+		sam_set_account_init_flag(sampass, FLAG_SAM_CANCHANGETIME); 
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_pass_must_change_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.pass_must_change_time = mytime;
+
+	if (store)
+		sam_set_account_init_flag(sampass, FLAG_SAM_MUSTCHANGETIME); 
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_pass_last_set_time(SAM_ACCOUNT_HANDLE *sampass, NTTIME mytime)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.pass_last_set_time = mytime;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_hours_len(SAM_ACCOUNT_HANDLE *sampass, uint32 len)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.hours_len = len;
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_logon_divs(SAM_ACCOUNT_HANDLE *sampass, uint16 hours)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.logon_divs = hours;
+	return NT_STATUS_OK;
+}
+
+/**
+ * Set flags showing what is initalised in the SAM_ACCOUNT_HANDLE
+ * @param sampass the SAM_ACCOUNT_HANDLE in question
+ * @param flag The *new* flag to be set.  Old flags preserved
+ *             this flag is only added.  
+ **/
+ 
+NTSTATUS sam_set_account_init_flag(SAM_ACCOUNT_HANDLE *sampass, uint32 flag)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.init_flag |= flag;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_sid(SAM_ACCOUNT_HANDLE *sampass, DOM_SID *u_sid)
+{
+	if (!sampass || !u_sid)
+		return NT_STATUS_UNSUCCESSFUL;
+	
+	sid_copy(&sampass->private.account_sid, u_sid);
+
+	DEBUG(10, ("sam_set_account_sid: setting account sid %s\n", 
+		    sid_string_static(&sampass->private.account_sid)));
+	
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_sid_from_string(SAM_ACCOUNT_HANDLE *sampass, fstring u_sid)
+{
+	DOM_SID new_sid;
+	if (!sampass || !u_sid)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_account_sid_from_string: setting account sid %s\n",
+		   u_sid));
+
+	if (!string_to_sid(&new_sid, u_sid)) { 
+		DEBUG(1, ("sam_set_account_sid_from_string: %s isn't a valid SID!\n", u_sid));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+	 
+	if (!NT_STATUS_IS_OK(sam_set_account_sid(sampass, &new_sid))) {
+		DEBUG(1, ("sam_set_account_sid_from_string: could not set sid %s on SAM_ACCOUNT_HANDLE!\n", u_sid));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_pgroup_sid(SAM_ACCOUNT_HANDLE *sampass, DOM_SID *g_sid)
+{
+	if (!sampass || !g_sid)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sid_copy(&sampass->private.group_sid, g_sid);
+
+	DEBUG(10, ("sam_set_group_sid: setting group sid %s\n", 
+		    sid_string_static(&sampass->private.group_sid)));
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_pgroup_string(SAM_ACCOUNT_HANDLE *sampass, fstring g_sid)
+{
+	DOM_SID new_sid;
+	if (!sampass || !g_sid)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_group_sid_from_string: setting group sid %s\n",
+		   g_sid));
+
+	if (!string_to_sid(&new_sid, g_sid)) { 
+		DEBUG(1, ("sam_set_group_sid_from_string: %s isn't a valid SID!\n", g_sid));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+	 
+	if (!NT_STATUS_IS_OK(sam_set_account_pgroup_sid(sampass, &new_sid))) {
+		DEBUG(1, ("sam_set_group_sid_from_string: could not set sid %s on SAM_ACCOUNT_HANDLE!\n", g_sid));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the domain name.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_domain(SAM_ACCOUNT_HANDLE *sampass, SAM_DOMAIN_HANDLE *domain)
+{	
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.domain = domain;
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's NT name.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_name(SAM_ACCOUNT_HANDLE *sampass, const char *account_name)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_account_name: setting nt account_name %s, was %s\n", account_name, sampass->private.account_name));
+
+	sampass->private.account_name = talloc_strdup(sampass->mem_ctx, account_name);
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's full name.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_fullname(SAM_ACCOUNT_HANDLE *sampass, const char *full_name)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_account_fullname: setting full name %s, was %s\n", full_name, sampass->private.full_name));
+
+	sampass->private.full_name = talloc_strdup(sampass->mem_ctx, full_name);
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's logon script.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_logon_script(SAM_ACCOUNT_HANDLE *sampass, const char *logon_script, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_logon_script: from %s to %s\n", logon_script, sampass->private.logon_script));
+
+	sampass->private.logon_script = talloc_strdup(sampass->mem_ctx, logon_script);
+	
+	sam_set_account_init_flag(sampass, FLAG_SAM_LOGONSCRIPT);
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's profile path.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_profile_path(SAM_ACCOUNT_HANDLE *sampass, const char *profile_path, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_profile_path: setting profile path %s, was %s\n", profile_path, sampass->private.profile_path));
+ 
+	sampass->private.profile_path = talloc_strdup(sampass->mem_ctx, profile_path);
+		
+	if (store) {
+		DEBUG(10, ("sam_set_profile_path: setting profile path sam flag!\n"));
+		sam_set_account_init_flag(sampass, FLAG_SAM_PROFILE);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's directory drive.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_dir_drive(SAM_ACCOUNT_HANDLE *sampass, const char *dir_drive, BOOL store)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_dir_drive: setting dir drive %s, was %s\n", dir_drive,
+			sampass->private.dir_drive));
+ 
+	sampass->private.dir_drive = talloc_strdup(sampass->mem_ctx, dir_drive);
+		
+	if (store) {
+		DEBUG(10, ("sam_set_dir_drive: setting dir drive sam flag!\n"));
+		sam_set_account_init_flag(sampass, FLAG_SAM_DRIVE);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's home directory.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *home_dir, BOOL store)
+{
+	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_homedir: setting home dir %s, was %s\n", home_dir,
+		sampass->private.home_dir));
+ 
+	sampass->private.home_dir = talloc_strdup(sampass->mem_ctx, home_dir);
+		
+	if (store) {
+		DEBUG(10, ("sam_set_homedir: setting home dir sam flag!\n"));
+		sam_set_account_init_flag(sampass, FLAG_SAM_SMBHOME);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's unix home directory.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_unix_homedir(SAM_ACCOUNT_HANDLE *sampass, const char *unix_home_dir)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_unix_homedir: setting home dir %s, was %s\n", unix_home_dir,
+		sampass->private.unix_home_dir));
+ 
+	sampass->private.unix_home_dir = talloc_strdup(sampass->mem_ctx, unix_home_dir);
+		
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's account description.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_acct_desc(SAM_ACCOUNT_HANDLE *sampass, const char *acct_desc)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.acct_desc = talloc_strdup(sampass->mem_ctx, acct_desc);
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's workstation allowed list.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_workstations(SAM_ACCOUNT_HANDLE *sampass, const char *workstations)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	DEBUG(10, ("sam_set_workstations: setting workstations %s, was %s\n", workstations,
+			sampass->private.workstations));
+ 
+	sampass->private.workstations = talloc_strdup(sampass->mem_ctx, workstations);
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's 'unknown_str', whatever the heck this actually is...
+ ********************************************************************/
+
+NTSTATUS sam_set_account_unknown_str(SAM_ACCOUNT_HANDLE *sampass, const char *unknown_str)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.unknown_str = talloc_strdup(sampass->mem_ctx, unknown_str);
+		
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's dial string.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_munged_dial(SAM_ACCOUNT_HANDLE *sampass, const char *munged_dial)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.munged_dial = talloc_strdup(sampass->mem_ctx, munged_dial);
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's NT hash.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_nt_pwd(SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB data)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.nt_pw = data;
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's LM hash.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_lm_pwd(SAM_ACCOUNT_HANDLE *sampass, DATA_BLOB data)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.lm_pw = data;
+
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's plaintext password only (base procedure, see helper
+ below)
+ ********************************************************************/
+
+NTSTATUS sam_set_account_plaintext_pwd(SAM_ACCOUNT_HANDLE *sampass, const char *plain_pwd)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.plaintext_pw = talloc_strdup(sampass->mem_ctx, plain_pwd);
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_unknown_1(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.unknown_1 = unkn;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_unknown_2(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.unknown_2 = unkn;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_unknown_3(SAM_ACCOUNT_HANDLE *sampass, uint32 unkn)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	sampass->private.unknown_3 = unkn;
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_account_hours(SAM_ACCOUNT_HANDLE *sampass, const uint8 *hours)
+{
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+
+	if (!hours) {
+		memset ((char *)sampass->private.hours, 0, MAX_HOURS_LEN);
+		return NT_STATUS_OK;
+	}
+	
+	memcpy(sampass->private.hours, hours, MAX_HOURS_LEN);
+
+	return NT_STATUS_OK;
+}
+
+/* Helpful interfaces to the above */
+
+/*********************************************************************
+ Sets the last changed times and must change times for a normal
+ password change.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_pass_changed_now(SAM_ACCOUNT_HANDLE *sampass)
+{
+	uint32 expire;
+	NTTIME temptime;
+
+	if (!sampass)
+		return NT_STATUS_UNSUCCESSFUL;
+	
+	unix_to_nt_time(&temptime, time(NULL));
+	if (!NT_STATUS_IS_OK(sam_set_account_pass_last_set_time(sampass, temptime)))
+		return NT_STATUS_UNSUCCESSFUL;
+
+	if (!account_policy_get(AP_MAX_PASSWORD_AGE, &expire) 
+	    || (expire==(uint32)-1)) {
+
+		get_nttime_max(&temptime);
+		if (!NT_STATUS_IS_OK(sam_set_account_pass_must_change_time(sampass, temptime, False)))
+			return NT_STATUS_UNSUCCESSFUL;
+
+	} else {
+		/* FIXME: Add expire to temptime */
+		
+		if (!NT_STATUS_IS_OK(sam_get_account_pass_last_set_time(sampass,&temptime)) || !NT_STATUS_IS_OK(sam_set_account_pass_must_change_time(sampass, temptime,True)))
+			return NT_STATUS_UNSUCCESSFUL;
+	}
+	
+	return NT_STATUS_OK;
+}
+
+/*********************************************************************
+ Set the account's PLAINTEXT password.  Used as an interface to the above.
+ Also sets the last change time to NOW.
+ ********************************************************************/
+
+NTSTATUS sam_set_account_passwd(SAM_ACCOUNT_HANDLE *sampass, const char *plaintext)
+{
+	DATA_BLOB data;
+	uchar new_lanman_p16[16];
+	uchar new_nt_p16[16];
+
+	if (!sampass || !plaintext)
+		return NT_STATUS_UNSUCCESSFUL;
+	
+	nt_lm_owf_gen(plaintext, new_nt_p16, new_lanman_p16);
+
+	data = data_blob(new_nt_p16, 16);
+	if (!NT_STATUS_IS_OK(sam_set_account_nt_pwd(sampass, data)))
+		return NT_STATUS_UNSUCCESSFUL;
+
+	data = data_blob(new_lanman_p16, 16);
+
+	if (!NT_STATUS_IS_OK(sam_set_account_lm_pwd(sampass, data)))
+		return NT_STATUS_UNSUCCESSFUL;
+
+	if (!NT_STATUS_IS_OK(sam_set_account_plaintext_pwd(sampass, plaintext)))
+		return NT_STATUS_UNSUCCESSFUL;
+	
+	if (!NT_STATUS_IS_OK(sam_set_account_pass_changed_now(sampass)))
+		return NT_STATUS_UNSUCCESSFUL;
+
+	return NT_STATUS_OK;
+}
+
diff -Npur --exclude=CVS HEAD/source/sam/get_set_domain.c HEAD-fix/source/sam/get_set_domain.c
--- HEAD/source/sam/get_set_domain.c	Wed Aug 28 18:41:23 2002
+++ HEAD-fix/source/sam/get_set_domain.c	Thu Aug 29 00:49:50 2002
@@ -30,16 +30,16 @@ NTSTATUS sam_get_domain_sid(SAM_DOMAIN_H
 {
 	if (!domain || !sid) return NT_STATUS_UNSUCCESSFUL;
 
-	*sid = &domain->private.sid;
+	*sid = &(domain->private.sid);
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_get_domain_num_users(SAM_DOMAIN_HANDLE *domain, uint32 *num_users)
+NTSTATUS sam_get_domain_num_accounts(SAM_DOMAIN_HANDLE *domain, uint32 *num_accounts)
 {
-	if (!domain || !num_users) return NT_STATUS_UNSUCCESSFUL;
+	if (!domain || !num_accounts) return NT_STATUS_UNSUCCESSFUL;
 
-	*num_users = domain->private.num_users;
+	*num_accounts = domain->private.num_accounts;
 
 	return NT_STATUS_OK;
 }
@@ -71,15 +71,6 @@ NTSTATUS sam_get_domain_name(SAM_DOMAIN_
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_name(SAM_DOMAIN_HANDLE *domain, char *domain_name)
-{
-	if (!domain) return NT_STATUS_UNSUCCESSFUL;
-
-	domain->private.name = talloc_strdup(domain->mem_ctx, domain_name);
-
-	return NT_STATUS_OK;
-}
-
 NTSTATUS sam_get_domain_server(SAM_DOMAIN_HANDLE *domain, char **server_name)
 {
 	if (!domain || !server_name) return NT_STATUS_UNSUCCESSFUL;
@@ -89,15 +80,6 @@ NTSTATUS sam_get_domain_server(SAM_DOMAI
 	return NT_STATUS_OK;
 }
 
-NTSTATUS sam_set_domain_server(SAM_DOMAIN_HANDLE *domain, char *server_name)
-{
-	if (!domain) return NT_STATUS_UNSUCCESSFUL;
-
-	domain->private.servername = talloc_strdup(domain->mem_ctx, server_name);
-
-	return NT_STATUS_OK;
-}
-
 NTSTATUS sam_get_domain_max_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME *max_passwordage)
 {
 	if (!domain || !max_passwordage) return NT_STATUS_UNSUCCESSFUL;
@@ -182,6 +164,16 @@ NTSTATUS sam_get_domain_login_pwdchange(
 
 /* Set */
 
+NTSTATUS sam_set_domain_name(SAM_DOMAIN_HANDLE *domain, char *domain_name)
+{
+	if (!domain) return NT_STATUS_UNSUCCESSFUL;
+
+	domain->private.name = talloc_strdup(domain->mem_ctx, domain_name);
+
+	return NT_STATUS_OK;
+}
+
+
 NTSTATUS sam_set_domain_max_pwdage(SAM_DOMAIN_HANDLE *domain, NTTIME max_passwordage)
 {
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
@@ -258,6 +250,15 @@ NTSTATUS sam_set_domain_login_pwdchange(
 	if (!domain) return NT_STATUS_UNSUCCESSFUL;
 
 	domain->private.login_pwdchange = login_pwdchange;
+
+	return NT_STATUS_OK;
+}
+
+NTSTATUS sam_set_domain_server(SAM_DOMAIN_HANDLE *domain, char *server_name)
+{
+	if (!domain) return NT_STATUS_UNSUCCESSFUL;
+
+	domain->private.servername = talloc_strdup(domain->mem_ctx, server_name);
 
 	return NT_STATUS_OK;
 }
diff -Npur --exclude=CVS HEAD/source/sam/get_set_group.c HEAD-fix/source/sam/get_set_group.c
--- HEAD/source/sam/get_set_group.c	Wed Aug 28 06:54:43 2002
+++ HEAD-fix/source/sam/get_set_group.c	Wed Aug 28 23:46:23 2002
@@ -31,7 +31,7 @@ NTSTATUS sam_get_group_sid(const SAM_GRO
 {
 	if (!group || !sid) return NT_STATUS_UNSUCCESSFUL;
 
-	*sid = &group->private.sid;
+	*sid = &(group->private.sid);
 
 	return NT_STATUS_OK;
 }
diff -Npur --exclude=CVS HEAD/source/sam/get_set_user.c HEAD-fix/source/sam/get_set_user.c
--- HEAD/source/sam/get_set_user.c	Wed Aug 28 18:41:23 2002
+++ HEAD-fix/source/sam/get_set_user.c	Thu Jan  1 01:00:00 1970
@@ -1,903 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   SAM_USER_HANDLE access routines
-   Copyright (C) Andrew Bartlett			2002
-   Copyright (C) Stefan (metze) Metzmacher	2002
-   Copyright (C) Jelmer Vernooij 			2002
-      
-   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"
-
-#undef DBGC_CLASS
-#define DBGC_CLASS DBGC_SAM
-
-NTSTATUS sam_get_user_domain_sid (const SAM_USER_HANDLE *sampass, DOM_SID **sid)
-{
-	NTSTATUS status;
-	SAM_DOMAIN_HANDLE *domain;
-	if (!sampass || !sid) return NT_STATUS_UNSUCCESSFUL;
-
-	if (!NT_STATUS_IS_OK(status = sam_get_user_domain(sampass, &domain))){
-		DEBUG(0, ("sam_get_user_domain_sid: Can't get domain for user\n"));
-		return status;
-	}
-
-	return sam_get_domain_sid(domain, sid);
-}
-
-NTSTATUS sam_get_user_domain_name (const SAM_USER_HANDLE *sampass, char **domain_name)
-{
-	NTSTATUS status;
-	SAM_DOMAIN_HANDLE *domain;
-	if (!sampass || !domain_name) return NT_STATUS_UNSUCCESSFUL;
-
-	if (!NT_STATUS_IS_OK(status = sam_get_user_domain(sampass, &domain))){
-		DEBUG(0, ("sam_get_user_domain_name: Can't get domain for user\n"));
-		return status;
-	}
-
-	return sam_get_domain_name(domain, domain_name);
-}
-
-NTSTATUS sam_get_user_acct_ctrl (const SAM_USER_HANDLE *sampass, uint16 *acct_ctrl)
-{
-	if(!sampass || !acct_ctrl) return NT_STATUS_UNSUCCESSFUL;
-
-	*acct_ctrl = sampass->private.acct_ctrl;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_logon_time (const SAM_USER_HANDLE *sampass, NTTIME *logon_time)
-{
-	if(!sampass || !logon_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*logon_time = sampass->private.logon_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_logoff_time (const SAM_USER_HANDLE *sampass, NTTIME *logoff_time)
-{
-	if(!sampass || !logoff_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*logoff_time = sampass->private.logoff_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_kickoff_time (const SAM_USER_HANDLE *sampass, NTTIME *kickoff_time)
-{
-	if (!sampass || !kickoff_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*kickoff_time = sampass->private.kickoff_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_pass_last_set_time (const SAM_USER_HANDLE *sampass, NTTIME *pass_last_set_time)
-{
-	if (!sampass || !pass_last_set_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*pass_last_set_time = sampass->private.pass_last_set_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_pass_can_change_time (const SAM_USER_HANDLE *sampass, NTTIME *pass_can_change_time)
-{
-	if (!sampass || !pass_can_change_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*pass_can_change_time = sampass->private.pass_can_change_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_pass_must_change_time (const SAM_USER_HANDLE *sampass, NTTIME *pass_must_change_time)
-{
-	if (!sampass || !pass_must_change_time) return NT_STATUS_UNSUCCESSFUL;
-
-	*pass_must_change_time = sampass->private.pass_must_change_time;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_logon_divs (const SAM_USER_HANDLE *sampass, uint16 *logon_divs)
-{
-	if (!sampass || !logon_divs) return NT_STATUS_UNSUCCESSFUL;
-
-	*logon_divs = sampass->private.logon_divs;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_hours_len (const SAM_USER_HANDLE *sampass, uint32 *hours_len)
-{
-	if (!sampass || !hours_len) return NT_STATUS_UNSUCCESSFUL;
-
-	*hours_len = sampass->private.hours_len;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_hours (const SAM_USER_HANDLE *sampass, uint8 **hours)
-{
-	if (!sampass || !hours) return NT_STATUS_UNSUCCESSFUL;
-
-	*hours = sampass->private.hours;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_nt_pwd (const SAM_USER_HANDLE *sampass, DATA_BLOB *nt_pwd)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	SMB_ASSERT((!sampass->private.nt_pw.data) 
-		   || sampass->private.nt_pw.length == NT_HASH_LEN);
-
-	*nt_pwd = sampass->private.nt_pw;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_lm_pwd (const SAM_USER_HANDLE *sampass, DATA_BLOB *lm_pwd)
-{ 
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	SMB_ASSERT((!sampass->private.lm_pw.data) 
-		   || sampass->private.lm_pw.length == LM_HASH_LEN);
-
-	*lm_pwd = sampass->private.lm_pw;
-
-	return NT_STATUS_OK;
-}
-
-/* Return the plaintext password if known.  Most of the time
-   it isn't, so don't assume anything magic about this function.
-   
-   Used to pass the plaintext to sam backends that might 
-   want to store more than just the NTLM hashes.
-*/
-
-NTSTATUS sam_get_user_plaintext_pwd (const SAM_USER_HANDLE *sampass, DATA_BLOB **plain_pwd)
-{
-	if (!sampass || !plain_pwd) return NT_STATUS_UNSUCCESSFUL;
-
-	*plain_pwd = &(sampass->private.plaintext_pw);
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_sid(const SAM_USER_HANDLE *sampass, DOM_SID **sid)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*sid = &(sampass->private.user_sid);
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_pgroup(const SAM_USER_HANDLE *sampass, DOM_SID **sid)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*sid = &(sampass->private.group_sid);
-
-	return NT_STATUS_OK;
-}
-
-/**
- * Get flags showing what is initalised in the SAM_USER_HANDLE
- * @param sampass the SAM_USER_HANDLE in question
- * @return the flags indicating the members initialised in the struct.
- **/
- 
-NTSTATUS sam_get_user_init_flag (const SAM_USER_HANDLE *sampass, uint32 *initflag)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*initflag = sampass->private.init_flag;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_name (const SAM_USER_HANDLE *sampass, char **username)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*username = sampass->private.username;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_domain (const SAM_USER_HANDLE *sampass, SAM_DOMAIN_HANDLE **domain)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*domain = sampass->private.domain;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_fullname (const SAM_USER_HANDLE *sampass, char **fullname)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*fullname = sampass->private.full_name;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_homedir (const SAM_USER_HANDLE *sampass, char **homedir)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*homedir = sampass->private.home_dir;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_unix_home_dir (const SAM_USER_HANDLE *sampass, char **uhomedir)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*uhomedir = sampass->private.unix_home_dir;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_dir_drive (const SAM_USER_HANDLE *sampass, char **dirdrive)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*dirdrive = sampass->private.dir_drive;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_logon_script (const SAM_USER_HANDLE *sampass, char **logon_script)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*logon_script = sampass->private.logon_script;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_profile_path (const SAM_USER_HANDLE *sampass, char **profile_path)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*profile_path = sampass->private.profile_path;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_description (const SAM_USER_HANDLE *sampass, char **description)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*description = sampass->private.acct_desc;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_workstations (const SAM_USER_HANDLE *sampass, char **workstations)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*workstations = sampass->private.workstations;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_unknown_str (const SAM_USER_HANDLE *sampass, char **unknown_str)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*unknown_str = sampass->private.unknown_str;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_munged_dial (const SAM_USER_HANDLE *sampass, char **munged_dial)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	*munged_dial = sampass->private.munged_dial;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_unknown_1 (const SAM_USER_HANDLE *sampass, uint32 *unknown1)
-{
-	if (!sampass || !unknown1) return NT_STATUS_UNSUCCESSFUL;
-
-	*unknown1 = sampass->private.unknown_1;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_unknown_2 (const SAM_USER_HANDLE *sampass, uint32 *unknown2)
-{
-	if (!sampass || !unknown2) return NT_STATUS_UNSUCCESSFUL;
-
-	*unknown2 = sampass->private.unknown_2;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_get_user_unknown_3 (const SAM_USER_HANDLE *sampass, uint32 *unknown3)
-{
-	if (!sampass || !unknown3) return NT_STATUS_UNSUCCESSFUL;
-
-	*unknown3 = sampass->private.unknown_3;
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Collection of set...() functions for SAM_USER_HANDLE_INFO.
- ********************************************************************/
-
-NTSTATUS sam_set_user_acct_ctrl (SAM_USER_HANDLE *sampass, uint16 flags)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-		
-	sampass->private.acct_ctrl = flags;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_logon_time (SAM_USER_HANDLE *sampass, NTTIME mytime, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.logon_time = mytime;
-
-	if (store)
-		sam_set_user_init_flag(sampass, FLAG_SAM_LOGONTIME); 
-
-	return NT_STATUS_UNSUCCESSFUL;
-}
-
-NTSTATUS sam_set_user_logoff_time (SAM_USER_HANDLE *sampass, NTTIME mytime, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.logoff_time = mytime;
-
-	if (store)
-		sam_set_user_init_flag(sampass, FLAG_SAM_LOGOFFTIME); 
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_kickoff_time (SAM_USER_HANDLE *sampass, NTTIME mytime, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.kickoff_time = mytime;
-
-	if (store)
-		sam_set_user_init_flag(sampass, FLAG_SAM_KICKOFFTIME); 
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_pass_can_change_time (SAM_USER_HANDLE *sampass, NTTIME mytime, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.pass_can_change_time = mytime;
-
-	if (store)
-		sam_set_user_init_flag(sampass, FLAG_SAM_CANCHANGETIME); 
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_pass_must_change_time (SAM_USER_HANDLE *sampass, NTTIME mytime, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.pass_must_change_time = mytime;
-
-	if (store)
-		sam_set_user_init_flag(sampass, FLAG_SAM_MUSTCHANGETIME); 
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_pass_last_set_time (SAM_USER_HANDLE *sampass, NTTIME mytime)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.pass_last_set_time = mytime;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_hours_len (SAM_USER_HANDLE *sampass, uint32 len)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.hours_len = len;
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_logon_divs (SAM_USER_HANDLE *sampass, uint16 hours)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.logon_divs = hours;
-	return NT_STATUS_OK;
-}
-
-/**
- * Set flags showing what is initalised in the SAM_USER_HANDLE
- * @param sampass the SAM_USER_HANDLE in question
- * @param flag The *new* flag to be set.  Old flags preserved
- *             this flag is only added.  
- **/
- 
-NTSTATUS sam_set_user_init_flag (SAM_USER_HANDLE *sampass, uint32 flag)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.init_flag |= flag;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_sid (SAM_USER_HANDLE *sampass, DOM_SID *u_sid)
-{
-	if (!sampass || !u_sid)
-		return NT_STATUS_UNSUCCESSFUL;
-	
-	sid_copy(&sampass->private.user_sid, u_sid);
-
-	DEBUG(10, ("sam_set_user_sid: setting user sid %s\n", 
-		    sid_string_static(&sampass->private.user_sid)));
-	
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_sid_from_string (SAM_USER_HANDLE *sampass, fstring u_sid)
-{
-	DOM_SID new_sid;
-	if (!sampass || !u_sid)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_user_sid_from_string: setting user sid %s\n",
-		   u_sid));
-
-	if (!string_to_sid(&new_sid, u_sid)) { 
-		DEBUG(1, ("sam_set_user_sid_from_string: %s isn't a valid SID!\n", u_sid));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-	 
-	if (!NT_STATUS_IS_OK(sam_set_user_sid(sampass, &new_sid))) {
-		DEBUG(1, ("sam_set_user_sid_from_string: could not set sid %s on SAM_USER_HANDLE!\n", u_sid));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_pgroup_sid (SAM_USER_HANDLE *sampass, DOM_SID *g_sid)
-{
-	if (!sampass || !g_sid)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sid_copy(&sampass->private.group_sid, g_sid);
-
-	DEBUG(10, ("sam_set_group_sid: setting group sid %s\n", 
-		    sid_string_static(&sampass->private.group_sid)));
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_pgroup_string (SAM_USER_HANDLE *sampass, fstring g_sid)
-{
-	DOM_SID new_sid;
-	if (!sampass || !g_sid)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_group_sid_from_string: setting group sid %s\n",
-		   g_sid));
-
-	if (!string_to_sid(&new_sid, g_sid)) { 
-		DEBUG(1, ("sam_set_group_sid_from_string: %s isn't a valid SID!\n", g_sid));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-	 
-	if (!NT_STATUS_IS_OK(sam_set_user_pgroup_sid(sampass, &new_sid))) {
-		DEBUG(1, ("sam_set_group_sid_from_string: could not set sid %s on SAM_USER_HANDLE!\n", g_sid));
-		return NT_STATUS_UNSUCCESSFUL;
-	}
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the domain name.
- ********************************************************************/
-
-NTSTATUS sam_set_user_domain(SAM_USER_HANDLE *sampass, SAM_DOMAIN_HANDLE *domain)
-{	
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.domain = domain;
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's NT name.
- ********************************************************************/
-
-NTSTATUS sam_set_user_username(SAM_USER_HANDLE *sampass, const char *nt_username)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_user_username: setting nt username %s, was %s\n", nt_username, sampass->private.username));
-
-	sampass->private.username = talloc_strdup(sampass->mem_ctx, nt_username);
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's full name.
- ********************************************************************/
-
-NTSTATUS sam_set_user_fullname(SAM_USER_HANDLE *sampass, const char *full_name)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_user_fullname: setting full name %s, was %s\n", full_name, sampass->private.full_name));
-
-	sampass->private.full_name = talloc_strdup(sampass->mem_ctx, full_name);
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's logon script.
- ********************************************************************/
-
-NTSTATUS sam_set_user_logon_script(SAM_USER_HANDLE *sampass, const char *logon_script, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_logon_script: from %s to %s\n", logon_script, sampass->private.logon_script));
-
-	sampass->private.logon_script = talloc_strdup(sampass->mem_ctx, logon_script);
-	
-	sam_set_user_init_flag(sampass, FLAG_SAM_LOGONSCRIPT);
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's profile path.
- ********************************************************************/
-
-NTSTATUS sam_set_user_profile_path (SAM_USER_HANDLE *sampass, const char *profile_path, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_profile_path: setting profile path %s, was %s\n", profile_path, sampass->private.profile_path));
- 
-	sampass->private.profile_path = talloc_strdup(sampass->mem_ctx, profile_path);
-		
-	if (store) {
-		DEBUG(10, ("sam_set_profile_path: setting profile path sam flag!\n"));
-		sam_set_user_init_flag(sampass, FLAG_SAM_PROFILE);
-	}
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's directory drive.
- ********************************************************************/
-
-NTSTATUS sam_set_user_dir_drive (SAM_USER_HANDLE *sampass, const char *dir_drive, BOOL store)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_dir_drive: setting dir drive %s, was %s\n", dir_drive,
-			sampass->private.dir_drive));
- 
-	sampass->private.dir_drive = talloc_strdup(sampass->mem_ctx, dir_drive);
-		
-	if (store) {
-		DEBUG(10, ("sam_set_dir_drive: setting dir drive sam flag!\n"));
-		sam_set_user_init_flag(sampass, FLAG_SAM_DRIVE);
-	}
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's home directory.
- ********************************************************************/
-
-NTSTATUS sam_set_user_homedir (SAM_USER_HANDLE *sampass, const char *home_dir, BOOL store)
-{
-	if (!sampass) return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_homedir: setting home dir %s, was %s\n", home_dir,
-		sampass->private.home_dir));
- 
-	sampass->private.home_dir = talloc_strdup(sampass->mem_ctx, home_dir);
-		
-	if (store) {
-		DEBUG(10, ("sam_set_homedir: setting home dir sam flag!\n"));
-		sam_set_user_init_flag(sampass, FLAG_SAM_SMBHOME);
-	}
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's unix home directory.
- ********************************************************************/
-
-NTSTATUS sam_set_user_unix_homedir (SAM_USER_HANDLE *sampass, const char *unix_home_dir)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_unix_homedir: setting home dir %s, was %s\n", unix_home_dir,
-		sampass->private.unix_home_dir));
- 
-	sampass->private.unix_home_dir = talloc_strdup(sampass->mem_ctx, unix_home_dir);
-		
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's account description.
- ********************************************************************/
-
-NTSTATUS sam_set_user_acct_desc (SAM_USER_HANDLE *sampass, const char *acct_desc)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.acct_desc = talloc_strdup(sampass->mem_ctx, acct_desc);
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's workstation allowed list.
- ********************************************************************/
-
-NTSTATUS sam_set_user_workstations (SAM_USER_HANDLE *sampass, const char *workstations)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	DEBUG(10, ("sam_set_workstations: setting workstations %s, was %s\n", workstations,
-			sampass->private.workstations));
- 
-	sampass->private.workstations = talloc_strdup(sampass->mem_ctx, workstations);
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's 'unknown_str', whatever the heck this actually is...
- ********************************************************************/
-
-NTSTATUS sam_set_user_unknown_str (SAM_USER_HANDLE *sampass, const char *unknown_str)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.unknown_str = talloc_strdup(sampass->mem_ctx, unknown_str);
-		
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's dial string.
- ********************************************************************/
-
-NTSTATUS sam_set_user_munged_dial (SAM_USER_HANDLE *sampass, const char *munged_dial)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.munged_dial = talloc_strdup(sampass->mem_ctx, munged_dial);
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's NT hash.
- ********************************************************************/
-
-NTSTATUS sam_set_user_nt_pwd (SAM_USER_HANDLE *sampass, DATA_BLOB data)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.nt_pw = data;
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's LM hash.
- ********************************************************************/
-
-NTSTATUS sam_set_user_lm_pwd (SAM_USER_HANDLE *sampass, DATA_BLOB data)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.lm_pw = data;
-
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's plaintext password only (base procedure, see helper
- below)
- ********************************************************************/
-
-NTSTATUS sam_set_user_plaintext_pw_only (SAM_USER_HANDLE *sampass, DATA_BLOB data)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.plaintext_pw = data;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_unknown_1 (SAM_USER_HANDLE *sampass, uint32 unkn)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.unknown_1 = unkn;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_unknown_2 (SAM_USER_HANDLE *sampass, uint32 unkn)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.unknown_2 = unkn;
-
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_unknown_3 (SAM_USER_HANDLE *sampass, uint32 unkn)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	sampass->private.unknown_3 = unkn;
-	return NT_STATUS_OK;
-}
-
-NTSTATUS sam_set_user_hours (SAM_USER_HANDLE *sampass, const uint8 *hours)
-{
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-
-	if (!hours) {
-		memset ((char *)sampass->private.hours, 0, MAX_HOURS_LEN);
-		return NT_STATUS_OK;
-	}
-	
-	memcpy (sampass->private.hours, hours, MAX_HOURS_LEN);
-
-	return NT_STATUS_OK;
-}
-
-/* Helpful interfaces to the above */
-
-/*********************************************************************
- Sets the last changed times and must change times for a normal
- password change.
- ********************************************************************/
-
-NTSTATUS sam_set_user_pass_changed_now (SAM_USER_HANDLE *sampass)
-{
-	uint32 expire;
-	NTTIME temptime;
-
-	if (!sampass)
-		return NT_STATUS_UNSUCCESSFUL;
-	
-	unix_to_nt_time(&temptime, time(NULL));
-	if (!NT_STATUS_IS_OK(sam_set_user_pass_last_set_time (sampass, temptime)))
-		return NT_STATUS_UNSUCCESSFUL;
-
-	if (!account_policy_get(AP_MAX_PASSWORD_AGE, &expire) 
-	    || (expire==(uint32)-1)) {
-
-		get_nttime_max(&temptime);
-		if (!NT_STATUS_IS_OK(sam_set_user_pass_must_change_time (sampass, temptime, False)))
-			return NT_STATUS_UNSUCCESSFUL;
-
-	} else {
-		/* FIXME: Add expire to temptime */
-		
-		if (!NT_STATUS_IS_OK(sam_get_user_pass_last_set_time(sampass,&temptime)) || !NT_STATUS_IS_OK(sam_set_user_pass_must_change_time (sampass, temptime,True)))
-			return NT_STATUS_UNSUCCESSFUL;
-	}
-	
-	return NT_STATUS_OK;
-}
-
-/*********************************************************************
- Set the user's PLAINTEXT password.  Used as an interface to the above.
- Also sets the last change time to NOW.
- ********************************************************************/
-
-NTSTATUS sam_set_plaintext_passwd (SAM_USER_HANDLE *sampass, const char *plaintext)
-{
-	DATA_BLOB data;
-	uchar new_lanman_p16[16];
-	uchar new_nt_p16[16];
-
-	if (!sampass || !plaintext)
-		return NT_STATUS_UNSUCCESSFUL;
-	
-	nt_lm_owf_gen (plaintext, new_nt_p16, new_lanman_p16);
-
-	data = data_blob(new_nt_p16, 16);
-	if (!NT_STATUS_IS_OK(sam_set_user_nt_pwd (sampass, data)))
-		return NT_STATUS_UNSUCCESSFUL;
-
-	data = data_blob(new_lanman_p16, 16);
-
-	if (!NT_STATUS_IS_OK(sam_set_user_lm_pwd (sampass, data)))
-		return NT_STATUS_UNSUCCESSFUL;
-	
-	if (!NT_STATUS_IS_OK(sam_set_user_pass_changed_now (sampass)))
-		return NT_STATUS_UNSUCCESSFUL;
-
-	return NT_STATUS_OK;
-}
-
diff -Npur --exclude=CVS HEAD/source/sam/interface.c HEAD-fix/source/sam/interface.c
--- HEAD/source/sam/interface.c	Wed Aug 28 18:41:23 2002
+++ HEAD-fix/source/sam/interface.c	Thu Aug 29 01:17:07 2002
@@ -3,8 +3,8 @@
    Password and authentication handling
    Copyright (C) Andrew Bartlett			2002
    Copyright (C) Jelmer Vernooij			2002
-   Copyright (C) Stefan (metze) Metzmacher	2002
-   Copyright (C) Kai Kr?ger					2002
+   Copyright (C) Stefan (metze) Metzmacher		2002
+   Copyright (C) Kai Kr?ger				2002
 
    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
@@ -29,6 +29,7 @@
 /** List of various built-in sam modules */
 
 const struct sam_init_function_entry builtin_sam_init_functions[] = {
+	{ "plugin", sam_init_plugin },
 	{ NULL, NULL}
 };
 
@@ -41,9 +42,9 @@ const struct sam_init_function_entry bui
   in the selected backend
  *******************************************************************/
 
-NTSTATUS sam_get_methods_by_sid(const struct sam_context *context, struct sam_methods **sam_method, const DOM_SID *domainsid)
+NTSTATUS sam_get_methods_by_sid(const SAM_CONTEXT *context, SAM_METHODS **sam_method, const DOM_SID *domainsid)
 {
-	struct sam_methods *tmp_methods;
+	SAM_METHODS	*tmp_methods;
 
 	DEBUG(5,("sam_get_methods_by_sid: %d\n", __LINE__));
 
@@ -57,7 +58,7 @@ NTSTATUS sam_get_methods_by_sid(const st
 
 	while (tmp_methods)
 	{
-		if (sid_equal(domainsid, &tmp_methods->domain->private.sid))
+		if (sid_equal(domainsid, &(tmp_methods->domain->private.sid)))
 		{
 			(*sam_method) = tmp_methods;
 			return NT_STATUS_OK;
@@ -70,9 +71,9 @@ NTSTATUS sam_get_methods_by_sid(const st
 	return NT_STATUS_NO_SUCH_DOMAIN;
 }
 
-NTSTATUS sam_get_methods_by_name(const struct sam_context *context, struct sam_methods **sam_method, const char *domainname)
+NTSTATUS sam_get_methods_by_name(const SAM_CONTEXT *context, SAM_METHODS **sam_method, const char *domainname)
 {
-	struct sam_methods *tmp_methods;
+	SAM_METHODS	*tmp_methods;
 
 	DEBUG(5,("sam_get_methods_by_name: %d\n", __LINE__));
 
@@ -99,11 +100,10 @@ NTSTATUS sam_get_methods_by_name(const s
 	return NT_STATUS_NO_SUCH_DOMAIN;
 }
 
-NTSTATUS context_sam_get_sec_desc(const struct sam_context *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
+NTSTATUS context_sam_get_sec_desc(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
 {
-	struct sam_methods *tmp_methods;
-//	DOM_SID            *domainsid;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS        nt_status;
 
 	DEBUG(5,("context_sam_get_sec_desc: %d\n", __LINE__));
 
@@ -125,11 +125,10 @@ NTSTATUS context_sam_get_sec_desc(const 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_set_sec_desc(const struct sam_context *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
+NTSTATUS context_sam_set_sec_desc(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
 {
-	struct sam_methods *tmp_methods;
-//	DOM_SID            *domainsid;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_set_sec_desc: %d\n", __LINE__));
 
@@ -152,10 +151,10 @@ NTSTATUS context_sam_set_sec_desc(const 
 }
 
 
-NTSTATUS context_sam_lookup_name(const struct sam_context *context, const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid, uint32 *type)
+NTSTATUS context_sam_lookup_name(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid, uint32 *type)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_lookup_name: %d\n", __LINE__));
 
@@ -178,12 +177,12 @@ NTSTATUS context_sam_lookup_name(const s
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_lookup_sid(const struct sam_context *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
+NTSTATUS context_sam_lookup_sid(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
 {
-	struct sam_methods *tmp_methods;
-	uint32             rid;
-	NTSTATUS            nt_status;
-	DOM_SID				domainsid;
+	SAM_METHODS	*tmp_methods;
+	uint32		rid;
+	NTSTATUS	nt_status;
+	DOM_SID		domainsid;
 
 	DEBUG(5,("context_sam_lookup_sid: %d\n", __LINE__));
 
@@ -213,20 +212,20 @@ NTSTATUS context_sam_lookup_sid(const st
 }
 
 
-NTSTATUS context_sam_update_domain(const struct sam_context *context, const SAM_DOMAIN_HANDLE *domain)
+NTSTATUS context_sam_update_domain(const SAM_CONTEXT *context, const SAM_DOMAIN_HANDLE *domain)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS context_sam_enum_domains(const struct sam_context *context, const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char ***domain_names)
+NTSTATUS context_sam_enum_domains(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char ***domain_names)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	SEC_DESC            *sd;
-	size_t              sd_size;
-	uint32              acc_granted;
-	int                 i = 0;
+	SEC_DESC	*sd;
+	size_t		sd_size;
+	uint32		acc_granted;
+	int		i = 0;
 
 	DEBUG(5,("context_sam_enum_domains: %d\n", __LINE__));
 
@@ -288,14 +287,14 @@ NTSTATUS context_sam_enum_domains(const 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_lookup_domain(const struct sam_context *context, const NT_USER_TOKEN *access_token, const char *domain, DOM_SID **domainsid)
+NTSTATUS context_sam_lookup_domain(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const char *domain, DOM_SID **domainsid)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	SEC_DESC           *sd;
-	size_t              sd_size;
-	uint32              acc_granted;
+	SEC_DESC	*sd;
+	size_t		sd_size;
+	uint32		acc_granted;
 
 	DEBUG(5,("context_sam_lookup_domain: %d\n", __LINE__));
 
@@ -329,10 +328,10 @@ NTSTATUS context_sam_lookup_domain(const
 }
 
 
-NTSTATUS context_sam_get_domain_by_sid(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain)
+NTSTATUS context_sam_get_domain_by_sid(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_get_domain_by_sid: %d\n", __LINE__));
 
@@ -355,25 +354,25 @@ NTSTATUS context_sam_get_domain_by_sid(c
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_create_user(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, DOM_SID *domainsid, SAM_USER_HANDLE **user)
+NTSTATUS context_sam_create_account(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	DEBUG(5,("context_sam_create_user: %d\n", __LINE__));
+	DEBUG(5,("context_sam_create_account: %d\n", __LINE__));
 
 	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
 		return nt_status;
 	}
 
-	if (!tmp_methods->sam_create_user) {
-		DEBUG(3, ("context_sam_create_user: sam_methods of the domain did not specify sam_create_user\n"));
+	if (!tmp_methods->sam_create_account) {
+		DEBUG(3, ("context_sam_create_account: sam_methods of the domain did not specify sam_create_account\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_user(tmp_methods, access_token, access_desired, user))) {
-		DEBUG(4,("context_sam_create_user in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_create_account(tmp_methods, access_token, access_desired, account))) {
+		DEBUG(4,("context_sam_create_account in backend %s failed\n",
 				 tmp_methods->backendname));
 		return nt_status;
 	}
@@ -381,139 +380,139 @@ NTSTATUS context_sam_create_user(const s
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_add_user(const struct sam_context *context, const SAM_USER_HANDLE *user)
+NTSTATUS context_sam_add_account(const SAM_CONTEXT *context, const SAM_ACCOUNT_HANDLE *account)
 {
 	DOM_SID		domainsid;
-	DOM_SID		*usersid;
-	struct sam_methods *tmp_methods;
+	DOM_SID		*accountsid;
+	SAM_METHODS	*tmp_methods;
 	uint32		rid;
-	NTSTATUS status;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_user_sid(user, &usersid))) {
-		DEBUG(0,("Can't get user SID\n"));
-		return status;
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_account_sid(account, &accountsid))) {
+		DEBUG(0,("Can't get account SID\n"));
+		return nt_status;
 	}
 
-	sid_copy(&domainsid, usersid);
+	sid_copy(&domainsid, accountsid);
 	if (!sid_split_rid(&domainsid, &rid)) {
-		DEBUG(3,("context_sam_get_user_by_sid: failed to split the sid\n"));
+		DEBUG(3,("context_sam_get_account_by_sid: failed to split the sid\n"));
 		return NT_STATUS_INVALID_SID;
 	}
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 
-	if (!tmp_methods->sam_add_user) {
-		DEBUG(3, ("context_sam_add_user: sam_methods of the domain did not specify sam_add_user\n"));
+	if (!tmp_methods->sam_add_account) {
+		DEBUG(3, ("context_sam_add_account: sam_methods of the domain did not specify sam_add_account\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_add_user(tmp_methods, user))){
-		DEBUG(4,("context_sam_add_user in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_add_account(tmp_methods, account))){
+		DEBUG(4,("context_sam_add_account in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_update_user(const struct sam_context *context, const SAM_USER_HANDLE *user)
+NTSTATUS context_sam_update_account(const SAM_CONTEXT *context, const SAM_ACCOUNT_HANDLE *account)
 {
 	DOM_SID		domainsid;
-	struct sam_methods *tmp_methods;
-	DOM_SID		*usersid;
+	SAM_METHODS	*tmp_methods;
+	DOM_SID		*accountsid;
 	uint32		rid;
-	NTSTATUS status;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_user_sid(user, &usersid))) {
-		DEBUG(0,("Can't get user SID\n"));
-		return status;
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_account_sid(account, &accountsid))) {
+		DEBUG(0,("Can't get account SID\n"));
+		return nt_status;
 	}
 
-	sid_copy(&domainsid, usersid);
+	sid_copy(&domainsid, accountsid);
 	if (!sid_split_rid(&domainsid, &rid)) {
-		DEBUG(3,("context_sam_get_user_by_sid: failed to split the sid\n"));
+		DEBUG(3,("context_sam_get_account_by_sid: failed to split the sid\n"));
 		return NT_STATUS_INVALID_SID;
 	}
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 	
-	if (!tmp_methods->sam_update_user) {
-		DEBUG(3, ("context_sam_update_user: sam_methods of the domain did not specify sam_update_user\n"));
+	if (!tmp_methods->sam_update_account) {
+		DEBUG(3, ("context_sam_update_account: sam_methods of the domain did not specify sam_update_account\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_update_user(tmp_methods, user))){
-		DEBUG(4,("context_sam_update_user in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_update_account(tmp_methods, account))){
+		DEBUG(4,("context_sam_update_account in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_delete_user(const struct sam_context *context, SAM_USER_HANDLE *user)
+NTSTATUS context_sam_delete_account(const SAM_CONTEXT *context, const SAM_ACCOUNT_HANDLE *account)
 {
 	DOM_SID		domainsid;
-	struct sam_methods *tmp_methods;
-	DOM_SID		*usersid;
+	SAM_METHODS	*tmp_methods;
+	DOM_SID		*accountsid;
 	uint32		rid;
-	NTSTATUS status;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_user_sid(user, &usersid))) {
-		DEBUG(0,("Can't get user SID\n"));
-		return status;
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_account_sid(account, &accountsid))) {
+		DEBUG(0,("Can't get account SID\n"));
+		return nt_status;
 	}
 
-	sid_copy(&domainsid, usersid);
+	sid_copy(&domainsid, accountsid);
 	if (!sid_split_rid(&domainsid, &rid)) {
-		DEBUG(3,("context_sam_get_user_by_sid: failed to split the sid\n"));
+		DEBUG(3,("context_sam_get_account_by_sid: failed to split the sid\n"));
 		return NT_STATUS_INVALID_SID;
 	}
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 
-	if (!tmp_methods->sam_delete_user) {
-		DEBUG(3, ("context_sam_delete_user: sam_methods of the domain did not specify sam_delete_user\n"));
+	if (!tmp_methods->sam_delete_account) {
+		DEBUG(3, ("context_sam_delete_account: sam_methods of the domain did not specify sam_delete_account\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_delete_user(tmp_methods, user))){
-		DEBUG(4,("context_sam_delete_user in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_delete_account(tmp_methods, account))){
+		DEBUG(4,("context_sam_delete_account in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_enum_users(const struct sam_context *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, int32 *user_count, SAM_USER_ENUM **users)
+NTSTATUS context_sam_enum_accounts(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	DEBUG(5,("context_sam_enum_users: %d\n", __LINE__));
+	DEBUG(5,("context_sam_enum_accounts: %d\n", __LINE__));
 
 	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
 		return nt_status;
 	}
 
-	if (!tmp_methods->sam_enum_users) {
-		DEBUG(3, ("context_sam_enum_users: sam_methods of the domain did not specify sam_enum_users\n"));
+	if (!tmp_methods->sam_enum_accounts) {
+		DEBUG(3, ("context_sam_enum_accounts: sam_methods of the domain did not specify sam_enum_accounts\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_users(tmp_methods, access_token, user_count, users))) {
-		DEBUG(4,("context_sam_enum_users for domain %s in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_enum_accounts(tmp_methods, access_token, account_count, accounts))) {
+		DEBUG(4,("context_sam_enum_accounts for domain %s in backend %s failed\n",
 				 tmp_methods->domain->private.name, tmp_methods->backendname));
 		return nt_status;
 	}
@@ -522,18 +521,18 @@ NTSTATUS context_sam_enum_users(const st
 }
 
 
-NTSTATUS context_sam_get_user_by_sid(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *usersid, SAM_USER_HANDLE **user)
+NTSTATUS context_sam_get_account_by_sid(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
 {
-	struct sam_methods *tmp_methods;
-	uint32              rid;
-	DOM_SID				domainsid;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	uint32		rid;
+	DOM_SID		domainsid;
+	NTSTATUS	nt_status;
 
-	DEBUG(5,("context_sam_get_user_by_sid: %d\n", __LINE__));
+	DEBUG(5,("context_sam_get_account_by_sid: %d\n", __LINE__));
 
-	sid_copy(&domainsid, usersid);
+	sid_copy(&domainsid, accountsid);
 	if (!sid_split_rid(&domainsid, &rid)) {
-		DEBUG(3,("context_sam_get_user_by_sid: failed to split the sid\n"));
+		DEBUG(3,("context_sam_get_account_by_sid: failed to split the sid\n"));
 		return NT_STATUS_INVALID_SID;
 	}
 
@@ -543,39 +542,39 @@ NTSTATUS context_sam_get_user_by_sid(con
 		return nt_status;
 	}
 
-	if (!tmp_methods->sam_get_user_by_sid) {
-		DEBUG(3, ("context_sam_get_user_by_sid: sam_methods of the domain did not specify sam_get_user_by_sid\n"));
+	if (!tmp_methods->sam_get_account_by_sid) {
+		DEBUG(3, ("context_sam_get_account_by_sid: sam_methods of the domain did not specify sam_get_account_by_sid\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_get_user_by_sid(tmp_methods, access_token, access_desired, usersid, user))) {
-		DEBUG(4,("context_sam_get_user_by_sid for %s in backend %s failed\n",
-				 sid_string_static(usersid), tmp_methods->backendname));
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_get_account_by_sid(tmp_methods, access_token, access_desired, accountsid, account))) {
+		DEBUG(4,("context_sam_get_account_by_sid for %s in backend %s failed\n",
+				 sid_string_static(accountsid), tmp_methods->backendname));
 		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_get_user_by_name(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_USER_HANDLE **user)
+NTSTATUS context_sam_get_account_by_name(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_ACCOUNT_HANDLE **account)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	DEBUG(5,("context_sam_get_user_by_name: %d\n", __LINE__));
+	DEBUG(5,("context_sam_get_account_by_name: %d\n", __LINE__));
 
 	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_name(context, &tmp_methods, domain))) {
 		DEBUG(4,("sam_get_methods_by_name failed\n"));
 		return nt_status;
 	}
 
-	if (!tmp_methods->sam_get_user_by_name) {
-		DEBUG(3, ("context_sam_get_user_by_name: sam_methods of the domain did not specify sam_get_user_by_name\n"));
+	if (!tmp_methods->sam_get_account_by_name) {
+		DEBUG(3, ("context_sam_get_account_by_name: sam_methods of the domain did not specify sam_get_account_by_name\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_get_user_by_name(tmp_methods, access_token, access_desired, name, user))) {
-		DEBUG(4,("context_sam_get_user_by_name for %s\\%s in backend %s failed\n",
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_get_account_by_name(tmp_methods, access_token, access_desired, name, account))) {
+		DEBUG(4,("context_sam_get_account_by_name for %s\\%s in backend %s failed\n",
 				 domain, name, tmp_methods->backendname));
 		return nt_status;
 	}
@@ -583,10 +582,10 @@ NTSTATUS context_sam_get_user_by_name(co
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_create_group(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, DOM_SID *sid, SAM_GROUP_HANDLE **group)
+NTSTATUS context_sam_create_group(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, DOM_SID *sid, SAM_GROUP_HANDLE **group)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_create_group: %d\n", __LINE__));
 
@@ -609,17 +608,17 @@ NTSTATUS context_sam_create_group(const 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_add_group(const struct sam_context *context, const SAM_GROUP_HANDLE *group)
+NTSTATUS context_sam_add_group(const SAM_CONTEXT *context, const SAM_GROUP_HANDLE *group)
 {
 	DOM_SID		domainsid;
 	DOM_SID		*groupsid;
-	struct sam_methods *tmp_methods;
+	SAM_METHODS	*tmp_methods;
 	uint32		rid;
-	NTSTATUS status;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_group_sid(group, &groupsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_group_sid(group, &groupsid))) {
 		DEBUG(0,("Can't get group SID\n"));
-		return status;
+		return nt_status;
 	}
 
 	sid_copy(&domainsid, groupsid);
@@ -628,9 +627,9 @@ NTSTATUS context_sam_add_group(const str
 		return NT_STATUS_INVALID_SID;
 	}
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 
 	if (!tmp_methods->sam_add_group) {
@@ -638,37 +637,23 @@ NTSTATUS context_sam_add_group(const str
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_add_group(tmp_methods, group))){
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_add_group(tmp_methods, group))){
 		DEBUG(4,("context_sam_add_group in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_update_group(const struct sam_context *context, const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group)
+NTSTATUS context_sam_update_group(const SAM_CONTEXT *context, const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group)
 {
-	DOM_SID		domainsid;
-	DOM_SID		*groupsid;
-	struct sam_methods *tmp_methods;
-	uint32		rid;
-	NTSTATUS status;
-
-	if (!NT_STATUS_IS_OK(status = sam_get_group_sid(group, &groupsid))) {
-		DEBUG(0,("Can't get group SID\n"));
-		return status;
-	}
-
-	sid_copy(&domainsid, groupsid);
-	if (!sid_split_rid(&domainsid, &rid)) {
-		DEBUG(3,("context_sam_get_group_by_sid: failed to split the sid\n"));
-		return NT_STATUS_INVALID_SID;
-	}
+	SAM_METHODS 	*tmp_methods;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 
 	if (!tmp_methods->sam_update_group) {
@@ -676,26 +661,26 @@ NTSTATUS context_sam_update_group(const 
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_update_group(tmp_methods, group))){
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_update_group(tmp_methods, group))){
 		DEBUG(4,("context_sam_update_group in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_delete_group(const struct sam_context *context, SAM_GROUP_HANDLE **groupsid)
+NTSTATUS context_sam_delete_group(const SAM_CONTEXT *context, const SAM_GROUP_HANDLE *group)
 {
 	DOM_SID		domainsid;
-	struct sam_methods *tmp_methods;
+	SAM_METHODS 	*tmp_methods;
 	DOM_SID		*groupsid;
 	uint32		rid;
-	NTSTATUS status;
+	NTSTATUS	nt_status;
 
-	if (!NT_STATUS_IS_OK(status = sam_get_group_sid(group, &groupsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_group_sid(group, &groupsid))) {
 		DEBUG(0,("Can't get group SID\n"));
-		return status;
+		return nt_status;
 	}
 
 	sid_copy(&domainsid, groupsid);
@@ -704,9 +689,9 @@ NTSTATUS context_sam_delete_group(const 
 		return NT_STATUS_INVALID_SID;
 	}
 
-	if (!NT_STATUS_IS_OK(status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
+	if (!NT_STATUS_IS_OK(nt_status = sam_get_methods_by_sid(context, &tmp_methods, &domainsid))) {
 		DEBUG(4,("sam_get_methods_by_sid failed\n"));
-		return status;
+		return nt_status;
 	}
 
 	if (!tmp_methods->sam_delete_group) {
@@ -714,19 +699,19 @@ NTSTATUS context_sam_delete_group(const 
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
 
-	if (!NT_STATUS_IS_OK(status = tmp_methods->sam_delete_group(tmp_methods, group))){
+	if (!NT_STATUS_IS_OK(nt_status = tmp_methods->sam_delete_group(tmp_methods, group))){
 		DEBUG(4,("context_sam_delete_group in backend %s failed\n",
 				 tmp_methods->backendname));
-		return status;
+		return nt_status;
 	}
 
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_enum_groups(const struct sam_context *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+NTSTATUS context_sam_enum_groups(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_enum_groups: %d\n", __LINE__));
 
@@ -735,7 +720,7 @@ NTSTATUS context_sam_enum_groups(const s
 		return nt_status;
 	}
 
-	if (!tmp_methods->sam_enum_users) {
+	if (!tmp_methods->sam_enum_accounts) {
 		DEBUG(3, ("context_sam_enum_groups: sam_methods of the domain did not specify sam_enum_groups\n"));
 		return NT_STATUS_NOT_IMPLEMENTED;
 	}
@@ -749,12 +734,12 @@ NTSTATUS context_sam_enum_groups(const s
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_get_group_by_sid(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
+NTSTATUS context_sam_get_group_by_sid(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
 {
-	struct sam_methods *tmp_methods;
-	uint32              rid;
-	NTSTATUS            nt_status;
-	DOM_SID				domainsid;
+	SAM_METHODS	*tmp_methods;
+	uint32		rid;
+	NTSTATUS	nt_status;
+	DOM_SID		domainsid;
 
 	DEBUG(5,("context_sam_get_group_by_sid: %d\n", __LINE__));
 
@@ -784,10 +769,10 @@ NTSTATUS context_sam_get_group_by_sid(co
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_get_group_by_name(const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group)
+NTSTATUS context_sam_get_group_by_name(const SAM_CONTEXT *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group)
 {
-	struct sam_methods *tmp_methods;
-	NTSTATUS            nt_status;
+	SAM_METHODS	*tmp_methods;
+	NTSTATUS	nt_status;
 
 	DEBUG(5,("context_sam_get_group_by_name: %d\n", __LINE__));
 
@@ -810,21 +795,21 @@ NTSTATUS context_sam_get_group_by_name(c
 	return NT_STATUS_OK;
 }
 
-NTSTATUS context_sam_add_member_to_group(const struct sam_context *context, SAM_GROUP_HANDLE *group, SAM_GROUP_MEMBER *member)
+NTSTATUS context_sam_add_member_to_group(const SAM_CONTEXT *context, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
-NTSTATUS context_sam_delete_member_from_group(const struct sam_context *context, SAM_GROUP_HANDLE *group, SAM_GROUP_MEMBER *member)
+NTSTATUS context_sam_delete_member_from_group(const SAM_CONTEXT *context, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS context_sam_enum_groupmembers(const struct sam_context *context, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
+NTSTATUS context_sam_enum_groupmembers(const SAM_CONTEXT *context, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
 
-NTSTATUS context_sam_get_groups_of_user(const struct sam_context *context, const SAM_USER_HANDLE *user, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+NTSTATUS context_sam_get_groups_of_account(const SAM_CONTEXT *context, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
 {
 	return NT_STATUS_NOT_IMPLEMENTED;
 }
@@ -835,9 +820,9 @@ NTSTATUS context_sam_get_groups_of_user(
   that the attached modules might have associated.
  *******************************************************************/
 
-void free_sam_context(struct sam_context **context)
+void free_sam_context(SAM_CONTEXT **context)
 {
-	struct sam_methods *sam_selected = (*context)->methods;
+	SAM_METHODS *sam_selected = (*context)->methods;
 
 	while (sam_selected){
 		if (sam_selected->free_private_data) {
@@ -854,10 +839,10 @@ void free_sam_context(struct sam_context
   Make a sam_methods from scratch
  *******************************************************************/
 
-NTSTATUS make_sam_context_list(struct sam_context **context, char **selected)
+NTSTATUS make_sam_context_list(SAM_CONTEXT **context, char **selected)
 {
 	int i = 0;
-	struct sam_methods *curmethods, *tmpmethods;
+	SAM_METHODS *curmethods, *tmpmethods;
 	NTSTATUS nt_status = NT_STATUS_UNSUCCESSFUL;
 
 	if (!NT_STATUS_IS_OK(nt_status = make_sam_context(context))) {
@@ -878,7 +863,7 @@ NTSTATUS make_sam_context_list(struct sa
     return NT_STATUS_OK;
 }
 
-NTSTATUS make_sam_methods_name(struct sam_methods **methods, struct sam_context *context, const char *selected)
+NTSTATUS make_sam_methods_name(SAM_METHODS **methods, SAM_CONTEXT *context, const char *selected)
 {
 	char *module_name = smb_xstrdup(selected);
 	char *module_location = NULL, *p;
@@ -922,7 +907,7 @@ NTSTATUS make_sam_methods_name(struct sa
   Make a sam_context from scratch.
  *******************************************************************/
 
-NTSTATUS make_sam_context(struct sam_context **context) 
+NTSTATUS make_sam_context(SAM_CONTEXT **context) 
 {
 	TALLOC_CTX *mem_ctx;
 
@@ -958,7 +943,7 @@ NTSTATUS make_sam_context(struct sam_con
 
 struct sam_context *sam_get_static_context(BOOL reload) 
 {
-	static struct sam_context *sam_context = NULL;
+	static SAM_CONTEXT *sam_context = NULL;
 
 	if ((sam_context) && (reload)) {
 		sam_context->free_fn(&sam_context);
@@ -990,7 +975,7 @@ BOOL initialize_sam(BOOL reload)
 
 NTSTATUS make_sam_methods(TALLOC_CTX *mem_ctx, SAM_METHODS **methods) 
 {
-	*methods = talloc(mem_ctx, sizeof(struct sam_methods));
+	*methods = talloc(mem_ctx, sizeof(SAM_METHODS));
 
 	if (!*methods) {
 		return NT_STATUS_NO_MEMORY;
diff -Npur --exclude=CVS HEAD/source/sam/plugin.c HEAD-fix/source/sam/plugin.c
--- HEAD/source/sam/plugin.c	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/source/sam/plugin.c	Wed Aug 28 17:43:40 2002
@@ -0,0 +1,81 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Loadable passdb module interface.
+   Copyright (C) Jelmer Vernooij			2002
+   Copyright (C) Andrew Bartlett			2002
+   Copyright (C) Stefan (metze) Metzmacher		2002
+      
+   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"
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_SAM
+
+NTSTATUS sam_init_plugin(SAM_CONTEXT *sam_context, SAM_METHODS **sam_method, const char *location)
+{
+	void * dl_handle;
+	char *plugin_location, *plugin_name, *p;
+	sam_init_function plugin_init;
+	int (*plugin_version)(void);
+
+	if (location == NULL) {
+		DEBUG(0, ("The plugin module needs an argument!\n"));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	plugin_name = smb_xstrdup(location);
+	p = strchr(plugin_name, ':');
+	if (p) {
+		*p = 0;
+		plugin_location = p+1;
+		trim_string(plugin_location, " ", " ");
+	} else plugin_location = NULL;
+	trim_string(plugin_name, " ", " ");
+
+	DEBUG(5, ("Trying to load sam plugin %s\n", plugin_name));
+	dl_handle = sys_dlopen(plugin_name, RTLD_NOW);
+	if (!dl_handle) {
+		DEBUG(0, ("Failed to load sam plugin %s using sys_dlopen (%s)\n", plugin_name, sys_dlerror()));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+    
+	plugin_version = sys_dlsym(dl_handle, "sam_version");
+	if (!plugin_version) {
+		sys_dlclose(dl_handle);
+		DEBUG(0, ("Failed to find function 'sam_version' using sys_dlsym in sam plugin %s (%s)\n", plugin_name, sys_dlerror()));	    
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	if (plugin_version()!=SAM_INTERFACE_VERSION) {
+		sys_dlclose(dl_handle);
+		DEBUG(0, ("Wrong SAM_INTERFACE_VERSION! sam plugin has version %d and version %d is needed! Please update!\n",
+			    plugin_version(),SAM_INTERFACE_VERSION));
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+				    	
+	plugin_init = sys_dlsym(dl_handle, "sam_init");
+	if (!plugin_init) {
+		sys_dlclose(dl_handle);
+		DEBUG(0, ("Failed to find function 'sam_init' using sys_dlsym in sam plugin %s (%s)\n", plugin_name, sys_dlerror()));	    
+		return NT_STATUS_UNSUCCESSFUL;
+	}
+
+	DEBUG(5, ("Starting sam plugin %s with location %s\n", plugin_name, plugin_location));
+	return plugin_init(sam_context, sam_method, plugin_location);
+}
+
+
--- HEAD/source/include/sam.h	Wed Aug 28 06:54:43 2002
+++ HEAD-fix/source/include/sam.h	Thu Aug 29 01:20:01 2002
@@ -34,105 +34,99 @@ int sam_version(void)\
 	return SAM_INTERFACE_VERSION;\
 }
 
-typedef struct sam_domain {
- TALLOC_CTX *mem_ctx;
- uint32 access_granted;
- struct sam_methods *current_sam_methods; /* sam_methods creating this
-handle */
- void (*free_fn)(struct sam_domain **);
- struct domain_data {
-  DOM_SID sid; /*SID of the domain. Should not be changed */
-  char *name; /* Name of the domain */
-  char *servername; /* */
-  NTTIME max_passwordage; /* time till next password expiration */
-  NTTIME min_passwordage; /* time till password can be changed again */
-  NTTIME lockout_duration; /* time till login is allowed again after
-lockout*/
-  NTTIME reset_count; /* time till bad login counter is reset */
-  uint16 min_passwordlength; /* minimum number of characters for a password
-*/
-  uint16 password_history; /* number of passwords stored in history */
-  uint16 lockout_count; /* number of bad login attempts before lockout */
-  BOOL force_logoff; /* force logoff after logon hours have expired */
-  BOOL login_pwdchange; /* Users need to logon to change their password */
-  uint32 num_users; /* number of users in the domain */
-  uint32 num_groups; /* number of global groups */
-  uint32 num_aliases; /* number of local groups */
- } private;
+typedef struct sam_domain_handle {
+	TALLOC_CTX *mem_ctx;
+	uint32 access_granted;
+	struct sam_methods *current_sam_methods; /* sam_methods creating this handle */
+	void (*free_fn)(struct sam_domain_handle **);
+	struct domain_data {
+		DOM_SID sid; /*SID of the domain. Should not be changed */
+		char *name; /* Name of the domain */
+		char *servername; /* */
+		NTTIME max_passwordage; /* time till next password expiration */
+		NTTIME min_passwordage; /* time till password can be changed again */
+		NTTIME lockout_duration; /* time till login is allowed again after lockout*/
+		NTTIME reset_count; /* time till bad login counter is reset */
+		uint16 min_passwordlength; /* minimum number of characters for a password */
+		uint16 password_history; /* number of passwords stored in history */
+		uint16 lockout_count; /* number of bad login attempts before lockout */
+		BOOL force_logoff; /* force logoff after logon hours have expired */
+		BOOL login_pwdchange; /* Users need to logon to change their password */
+		uint32 num_accounts; /* number of accounts in the domain */
+		uint32 num_groups; /* number of global groups */
+		uint32 num_aliases; /* number of local groups */
+	} private;
 } SAM_DOMAIN_HANDLE;
 
-typedef struct sam_user {
- TALLOC_CTX *mem_ctx;
- uint32 access_granted;
- struct sam_methods *current_sam_methods; /* sam_methods creating this
-handle */
- void (*free_fn)(struct sam_user **);
- struct sam_user_data {
-  uint32 init_flag;
-  NTTIME logon_time; /* logon time */
-  NTTIME logoff_time; /* logoff time */
-  NTTIME kickoff_time; /* kickoff time */
-  NTTIME pass_last_set_time; /* password last set time */
-  NTTIME pass_can_change_time; /* password can change time */
-  NTTIME pass_must_change_time; /* password must change time */
-  char * username; /* username string */
-  SAM_DOMAIN_HANDLE * domain; /* domain of user */
-  char * full_name; /* user's full name string */
-  char * unix_home_dir; /* UNIX home directory string */
-  char * home_dir; /* home directory string */
-  char * dir_drive; /* home directory drive string */
-  char * logon_script; /* logon script string */
-  char * profile_path; /* profile path string */
-  char * acct_desc; /* user description string */
-  char * workstations; /* login from workstations string */
-  char * unknown_str; /* don't know what this is, yet. */
-  char * munged_dial; /* munged path name and dial-back tel number */
-  DOM_SID user_sid; /* Primary User SID */
-  DOM_SID group_sid; /* Primary Group SID */
-  DATA_BLOB lm_pw; /* .data is Null if no password */
-  DATA_BLOB nt_pw; /* .data is Null if no password */
-  DATA_BLOB plaintext_pw; /* .data is Null if not available */
-  uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
-  uint32 unknown_1; /* 0x00ff ffff */
-  uint16 logon_divs; /* 168 - number of hours in a week */
-  uint32 hours_len; /* normally 21 bytes */
-  uint8 hours[MAX_HOURS_LEN];
-  uint32 unknown_2; /* 0x0002 0000 */
-  uint32 unknown_3; /* 0x0000 04ec */
- } private;
-} SAM_USER_HANDLE;
-
-typedef struct sam_group {
- TALLOC_CTX *mem_ctx;
- uint32 access_granted;
- struct sam_methods *current_sam_methods; /* sam_methods creating this
-handle */
- void (*free_fn)(struct sam_group **);
- struct sam_group_data {
-  char *name;
-  char *comment;
-  DOM_SID sid;
-  int32 flags; /* specifies if the group is a lokal group or a global group
-*/
-  uint32 num_members;
-  PRIVILEGE_SET privileges;
- } private;
+typedef struct sam_account_handle {
+	TALLOC_CTX *mem_ctx;
+	uint32 access_granted;
+	struct sam_methods *current_sam_methods; /* sam_methods creating this handle */
+	void (*free_fn)(struct sam_account_handle **);
+	struct sam_account_data {
+		uint32 init_flag;
+		NTTIME logon_time; /* logon time */
+		NTTIME logoff_time; /* logoff time */
+		NTTIME kickoff_time; /* kickoff time */
+		NTTIME pass_last_set_time; /* password last set time */
+		NTTIME pass_can_change_time; /* password can change time */
+		NTTIME pass_must_change_time; /* password must change time */
+		char * account_name; /* account_name string */
+		SAM_DOMAIN_HANDLE * domain; /* domain of account */
+		char *full_name; /* account's full name string */
+		char *unix_home_dir; /* UNIX home directory string */
+		char *home_dir; /* home directory string */
+		char *dir_drive; /* home directory drive string */
+		char *logon_script; /* logon script string */
+		char *profile_path; /* profile path string */
+		char *acct_desc; /* account description string */
+		char *workstations; /* login from workstations string */
+		char *unknown_str; /* don't know what this is, yet. */
+		char *munged_dial; /* munged path name and dial-back tel number */
+		DOM_SID account_sid; /* Primary Account SID */
+		DOM_SID group_sid; /* Primary Group SID */
+		DATA_BLOB lm_pw; /* .data is Null if no password */
+		DATA_BLOB nt_pw; /* .data is Null if no password */
+		char *plaintext_pw; /* if Null not available */
+		uint16 acct_ctrl; /* account info (ACB_xxxx bit-mask) */
+		uint32 unknown_1; /* 0x00ff ffff */
+		uint16 logon_divs; /* 168 - number of hours in a week */
+		uint32 hours_len; /* normally 21 bytes */
+		uint8 hours[MAX_HOURS_LEN];
+		uint32 unknown_2; /* 0x0002 0000 */
+		uint32 unknown_3; /* 0x0000 04ec */
+	} private;
+} SAM_ACCOUNT_HANDLE;
+
+typedef struct sam_group_handle {
+	TALLOC_CTX *mem_ctx;
+	uint32 access_granted;
+	struct sam_methods *current_sam_methods; /* sam_methods creating this handle */
+	void (*free_fn)(struct sam_group_handle **);
+	struct sam_group_data {
+		char *name;
+		char *comment;
+		DOM_SID sid;
+		int32 flags; /* specifies if the group is a lokal group or a global group */
+		uint32 num_members;
+		PRIVILEGE_SET privileges;
+	} private;
 } SAM_GROUP_HANDLE;
 
 
 typedef struct sam_group_member {
 	DOM_SID sid; 
-	BOOL group; /* specifies if it is a group or a user */ 
+	BOOL group; /* specifies if it is a group or a account */ 
 
 } SAM_GROUP_MEMBER;
 
-typedef struct sam_user_enum {
+typedef struct sam_account_enum {
 	DOM_SID sid; 
-	char *username; 
+	char *account_name; 
 	char *full_name; 
-	char *user_desc; 
+	char *account_desc; 
 	uint16 acc_ctrl; 
-} SAM_USER_ENUM;
+} SAM_ACCOUNT_ENUM;
 
 typedef struct sam_group_enum {
 	DOM_SID sid;
@@ -147,106 +141,106 @@ typedef struct sam_context 
 	
 	/* General API */
 	
-	NTSTATUS (*sam_get_sec_desc) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd);
-	NTSTATUS (*sam_set_sec_desc) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd);
+	NTSTATUS (*sam_get_sec_desc) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd);
+	NTSTATUS (*sam_set_sec_desc) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd);
 	
-	NTSTATUS (*sam_lookup_sid) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type);
-	NTSTATUS (*sam_lookup_name) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid,  uint32 *type);	
+	NTSTATUS (*sam_lookup_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type);
+	NTSTATUS (*sam_lookup_name) (const struct sam_context *, const NT_USER_TOKEN *access_token, const char *domain, const char *name, DOM_SID **sid, uint32 *type);
 
 
 	/* Domain API */
 
-	NTSTATUS (*sam_update_domain) ( const struct sam_context *, SAM_DOMAIN_HANDLE *domain);
+	NTSTATUS (*sam_update_domain) (const struct sam_context *, const SAM_DOMAIN_HANDLE *domain);
 
-	NTSTATUS (*sam_enum_domains) ( const struct sam_context *, const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char **domain_names);
-	NTSTATUS (*sam_lookup_domain) ( const struct sam_context *, const NT_USER_TOKEN * access_token, const char *domain, DOM_SID **domainsid);
+	NTSTATUS (*sam_enum_domains) (const struct sam_context *, const NT_USER_TOKEN *access_token, int32 *domain_count, DOM_SID **domains, char **domain_names);
+	NTSTATUS (*sam_lookup_domain) (const struct sam_context *, const NT_USER_TOKEN * access_token, const char *domain, DOM_SID **domainsid);
 
-	NTSTATUS (*sam_get_domain_by_sid) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain);
+	NTSTATUS (*sam_get_domain_by_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_DOMAIN_HANDLE **domain);
 
 
-	/* User API */
+	/* Account API */
 
-	NTSTATUS (*sam_create_user) ( const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, DOM_SID *domainsid, SAM_USER_HANDLE **user);
-	NTSTATUS (*sam_add_user) ( const struct sam_context *, DOM_SID *domainsid, SAM_USER_HANDLE *user);
-	NTSTATUS (*sam_update_user) ( const struct sam_context *, SAM_USER_HANDLE *user);
-	NTSTATUS (*sam_delete_user) ( const struct sam_context *, SAM_USER_HANDLE * user);
-	NTSTATUS (*sam_enum_users) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domain, int32 *user_count, SAM_USER_ENUM **users);
+	NTSTATUS (*sam_create_account) (const struct sam_context *context, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *domainsid, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_add_account) (const struct sam_context *, const DOM_SID *domainsid, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_update_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_delete_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_enum_accounts) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domain, int32 *account_count, SAM_ACCOUNT_ENUM **accounts);
 
-	NTSTATUS (*sam_get_user_by_sid) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *usersid, SAM_USER_HANDLE **user);
-	NTSTATUS (*sam_get_user_by_name) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_USER_HANDLE **user);
+	NTSTATUS (*sam_get_account_by_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_get_account_by_name) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_ACCOUNT_HANDLE **account);
 
 	/* Group API */
 
 
-	NTSTATUS (*sam_add_group) ( const struct sam_context *, DOM_SID *domainsid, SAM_GROUP_HANDLE *samgroup);
-	NTSTATUS (*sam_update_group) ( const struct sam_context *, SAM_GROUP_HANDLE *samgroup);
-	NTSTATUS (*sam_delete_group) ( const struct sam_context *, SAM_GROUP_HANDLE *groupsid);
-	NTSTATUS (*sam_enum_groups) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
-	NTSTATUS (*sam_get_group_by_sid) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
-	NTSTATUS (*sam_get_group_by_name) ( const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group);
-
-	NTSTATUS (*sam_add_member_to_group) ( const struct sam_context *, SAM_GROUP_HANDLE *group, SAM_GROUP_MEMBER *member);
-	NTSTATUS (*sam_delete_member_from_group) ( const struct sam_context *, SAM_GROUP_HANDLE *group, SAM_GROUP_MEMBER *member);
-	NTSTATUS (*sam_enum_groupmembers) ( const struct sam_context *, SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
+	NTSTATUS (*sam_add_group) (const struct sam_context *, const DOM_SID *domainsid, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_update_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_delete_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_enum_groups) (const struct sam_context *, const NT_USER_TOKEN *access_token, const DOM_SID *domainsid, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_get_group_by_sid) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
+	NTSTATUS (*sam_get_group_by_name) (const struct sam_context *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *domain, const char *name, SAM_GROUP_HANDLE **group);
+
+	NTSTATUS (*sam_add_member_to_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
+	NTSTATUS (*sam_delete_member_from_group) (const struct sam_context *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
+	NTSTATUS (*sam_enum_groupmembers) (const struct sam_context *, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
 
-	NTSTATUS (*sam_get_groups_of_user) ( const struct sam_context *, SAM_USER_HANDLE *user, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_get_groups_of_account) (const struct sam_context *, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
 
 	void (*free_fn)(struct sam_context **);
 } SAM_CONTEXT;
 
 typedef struct sam_methods 
 {
-	struct sam_context	*parent;
-	struct sam_methods	*next;
-	struct sam_methods	*prev;
+	struct sam_context		*parent;
+	struct sam_methods		*next;
+	struct sam_methods		*prev;
 	const char			*backendname;
-	struct sam_domain   *domain;
+	struct sam_domain_handle	*domain;
 	void				*private_data;
 	
 	/* General API */
 	
-	NTSTATUS (*sam_get_sec_desc) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd);
-	NTSTATUS (*sam_set_sec_desc) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd);
+	NTSTATUS (*sam_get_sec_desc) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd);
+	NTSTATUS (*sam_set_sec_desc) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd);
 	
-	NTSTATUS (*sam_lookup_sid) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type);
-	NTSTATUS (*sam_lookup_name) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const char *name, DOM_SID **sid,  uint32 *type);	
+	NTSTATUS (*sam_lookup_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type);
+	NTSTATUS (*sam_lookup_name) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const char *name, DOM_SID **sid, uint32 *type);
 	
 	/* Domain API */
 
-	NTSTATUS (*sam_update_domain) ( const struct sam_methods *, SAM_DOMAIN_HANDLE *domain);
+	NTSTATUS (*sam_update_domain) (const struct sam_methods *, const SAM_DOMAIN_HANDLE *domain);
 	NTSTATUS (*sam_get_domain_handle) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_DOMAIN_HANDLE **domain);
 
-	/* User API */
+	/* Account API */
 
-	NTSTATUS (*sam_create_user) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_USER_HANDLE **user);
-	NTSTATUS (*sam_add_user) ( const struct sam_methods *, const SAM_USER_HANDLE *user);
-	NTSTATUS (*sam_update_user) ( const struct sam_methods *, const SAM_USER_HANDLE *user);
-	NTSTATUS (*sam_delete_user) ( const struct sam_methods *, const SAM_USER_HANDLE *user);
-	NTSTATUS (*sam_enum_users) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, int32 *user_count, SAM_USER_ENUM **users);
+	NTSTATUS (*sam_create_account) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_add_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_update_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_delete_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account);
+	NTSTATUS (*sam_enum_accounts) (const struct sam_methods *, const NT_USER_TOKEN *access_token, int32 *account_count, SAM_ACCOUNT_ENUM **accounts);
 
-	NTSTATUS (*sam_get_user_by_sid) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *usersid, SAM_USER_HANDLE **user);
-	NTSTATUS (*sam_get_user_by_name) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_USER_HANDLE **user);
+	NTSTATUS (*sam_get_account_by_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account);
+	NTSTATUS (*sam_get_account_by_name) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_ACCOUNT_HANDLE **account);
 
 	/* Group API */
 
-	NTSTATUS (*sam_create_group) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, SAM_GROUP_HANDLE **group);
-	NTSTATUS (*sam_add_group) ( const struct sam_methods *, SAM_GROUP_HANDLE *samgroup);
-	NTSTATUS (*sam_update_group) ( const struct sam_methods *, SAM_GROUP_HANDLE *samgroup);
-	NTSTATUS (*sam_delete_group) ( const struct sam_methods *, SAM_GROUP_HANDLE *groupsid);
-	NTSTATUS (*sam_enum_groups) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
-	NTSTATUS (*sam_get_group_by_sid) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
-	NTSTATUS (*sam_get_group_by_name) ( const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group);
-
-	NTSTATUS (*sam_add_member_to_group) ( const struct sam_methods *, SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
-	NTSTATUS (*sam_delete_member_from_group) ( const struct sam_methods *, SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
-	NTSTATUS (*sam_enum_groupmembers) ( const struct sam_methods *, SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
+	NTSTATUS (*sam_create_group) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, SAM_GROUP_HANDLE **group);
+	NTSTATUS (*sam_add_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_update_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_delete_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group);
+	NTSTATUS (*sam_enum_groups) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_get_group_by_sid) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group);
+	NTSTATUS (*sam_get_group_by_name) (const struct sam_methods *, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group);
+
+	NTSTATUS (*sam_add_member_to_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
+	NTSTATUS (*sam_delete_member_from_group) (const struct sam_methods *, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member);
+	NTSTATUS (*sam_enum_groupmembers) (const struct sam_methods *, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members);
 
-	NTSTATUS (*sam_get_groups_of_user) ( const struct sam_methods *, SAM_USER_HANDLE *user, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
+	NTSTATUS (*sam_get_groups_of_account) (const struct sam_methods *, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups);
 
 	void (*free_private_data)(void **);
 } SAM_METHODS;
 
-typedef NTSTATUS (*sam_init_function)( const struct sam_context *, struct sam_methods **, const char *);
+typedef NTSTATUS (*sam_init_function)(const SAM_CONTEXT *, SAM_METHODS **, const char *);
 
 struct sam_init_function_entry {
 	char *name;
--- HEAD/source/Makefile.in	Wed Aug 28 12:47:31 2002
+++ HEAD-fix/source/Makefile.in	Thu Aug 29 00:53:46 2002
@@ -217,7 +217,8 @@ PASSDB_OBJ = $(PASSDB_GET_SET_OBJ) passd
 		passdb/pdb_unix.o passdb/util_sam_sid.o \
 		passdb/pdb_compat.o passdb/pdb_nisplus.o
 
-SAM_OBJ = sam/account.o sam/get_set_user.o sam/get_set_group.o sam/get_set_domain.o sam/interface.o
+SAM_OBJ = sam/account.o sam/get_set_account.o sam/get_set_group.o \
+		sam/get_set_domain.o sam/interface.o sam/api.c sam/plugin.c
 
 SAMTEST_OBJ = torture/samtest.o $(SAM_OBJ) $(LIB_OBJ) $(PARAM_OBJ) $(LIBSMB_OBJ) $(UBIQX_OBJ) $(LIB_OBJ) $(READLINE_OBJ)
 
diff -Npur --exclude=CVS HEAD/examples/sam/Makefile HEAD-fix/examples/sam/Makefile
--- HEAD/examples/sam/Makefile	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/examples/sam/Makefile	Wed Aug 28 20:07:14 2002
@@ -0,0 +1,31 @@
+# Makefile for samba SAM modules
+# Variables
+
+CC = gcc
+LIBTOOL = libtool
+
+SAMBA_SRC = ../../source
+SAMBA_INCL = ../../source/include
+UBIQX_SRC = ../../source/ubiqx
+SMBWR_SRC = ../../source/smbwrapper
+CFLAGS = -I$(SAMBA_SRC) -I$(SAMBA_INCL) -I$(UBIQX_SRC) -I$(SMBWR_SRC) -Wall -g
+SAM_OBJS = sam_skel.so
+
+# Default target
+
+default: $(SAM_OBJS)
+
+# Pattern rules
+
+%.so: %.lo
+	$(LIBTOOL) $(CC) -shared -o $@ $< $(LDFLAGS)
+
+%.lo: %.c
+	$(LIBTOOL) $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
+
+# Misc targets
+
+clean:
+	rm -rf .libs
+	rm -f core *~ *% *.bak \
+		$(SAM_OBJS) $(SAM_OBJS:.so=.o) $(SAM_OBJS:.so=.lo) 
diff -Npur --exclude=CVS HEAD/examples/sam/README HEAD-fix/examples/sam/README
--- HEAD/examples/sam/README	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/examples/sam/README	Thu Aug 29 11:50:46 2002
@@ -0,0 +1,29 @@
+README for Samba SAM Database examples
+====================================================
+26-08-2002 Stefan (metze) Metzmacher <metze at metzemix.de>
+
+Every module MUST have a sam_version() function.
+
+this is defined in include/sam.h:
+#define SAM_MODULE_VERSIONING_MAGIC \
+int sam_version(void)\
+{\
+	return SAM_INTERFACE_VERSION;\
+}
+
+You MUST add this line inside a module:
+SAM_MODULE_VERSIONING_MAGIC
+
+
+The sam_skel.c file in this directory contains a very basic example of 
+a SAM plugin. It just prints the name of the function that is executed using
+DEBUG. Maybe it's nice to include some of the arguments to the function in the 
+future too..
+
+New SAM plugins should go into the samba lib directory, (/usr/lib/samba/ 
+for most distributions) and should be prefixed with 'sam_' and should go into the 
+subdir sam/. The SAM subsystem will search in /usr/lib/samba/sam and fall back to 
+/usr/lib/samba/ . 
+An example path would be: 
+/usr/lib/samba/sam/sam_skel.so
+
diff -Npur --exclude=CVS HEAD/examples/sam/sam_skel.c HEAD-fix/examples/sam/sam_skel.c
--- HEAD/examples/sam/sam_skel.c	Thu Jan  1 01:00:00 1970
+++ HEAD-fix/examples/sam/sam_skel.c	Thu Aug 29 11:43:26 2002
@@ -0,0 +1,261 @@
+/*
+   Unix SMB/CIFS implementation.
+   this is a skeleton for SAM backend modules.
+	
+   Copyright (C) Stefan (metze) Metzmacher		2002
+
+   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"
+
+static int sam_skel_debug_level = DBGC_ALL;
+
+#undef DBGC_CLASS
+#define DBGC_CLASS sam_skel_debug_level
+
+/* define the version of the SAM interface */ 
+SAM_MODULE_VERSIONING_MAGIC
+
+
+/* General API */
+
+NTSTATUS sam_skel_get_sec_desc(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, SEC_DESC **sd)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_set_sec_desc(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, const SEC_DESC *sd)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+	
+NTSTATUS sam_skel_lookup_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const DOM_SID *sid, char **name, uint32 *type)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_lookup_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const char *name, DOM_SID **sid, uint32 *type)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+	
+/* Domain API */
+
+NTSTATUS sam_skel_update_domain(const struct sam_methods *sam_method, const SAM_DOMAIN_HANDLE *domain)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_get_domain_handle(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_DOMAIN_HANDLE **domain)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Account API */
+
+NTSTATUS sam_skel_create_account(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, SAM_ACCOUNT_HANDLE **account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_add_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_update_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_delete_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_enum_accounts(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, int32 *account_count, SAM_ACCOUNT_ENUM **accounts)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+NTSTATUS sam_skel_get_account_by_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *accountsid, SAM_ACCOUNT_HANDLE **account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_get_account_by_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_ACCOUNT_HANDLE **account)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+/* Group API */
+
+NTSTATUS sam_skel_create_group(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const uint32 type, SAM_GROUP_HANDLE **group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_add_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_update_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_delete_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_enum_groups(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 type, uint32 *groups_count, SAM_GROUP_ENUM **groups)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_get_group_by_sid(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const DOM_SID *groupsid, SAM_GROUP_HANDLE **group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_get_group_by_name(const struct sam_methods *sam_method, const NT_USER_TOKEN *access_token, const uint32 access_desired, const char *name, SAM_GROUP_HANDLE **group)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+NTSTATUS sam_skel_add_member_to_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_delete_member_from_group(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, const SAM_GROUP_MEMBER *member)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+NTSTATUS sam_skel_enum_groupmembers(const struct sam_methods *sam_method, const SAM_GROUP_HANDLE *group, uint32 *members_count, SAM_GROUP_MEMBER **members)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+NTSTATUS sam_skel_get_groups_of_account(const struct sam_methods *sam_method, const SAM_ACCOUNT_HANDLE *account, const uint32 type, uint32 *group_count, SAM_GROUP_ENUM **groups)
+{
+	DEBUG(0,("sam_skel: %s was called!\n",__FUNCTION__));
+	return NT_STATUS_NOT_IMPLEMENTED;
+}
+
+
+
+
+
+NTSTATUS sam_init(SAM_CONTEXT *sam_context, SAM_METHODS **sam_method, const char *location)
+{
+	NTSTATUS nt_status;
+
+	if (!NT_STATUS_IS_OK(nt_status = make_sam_methods(sam_context->mem_ctx, sam_method))) {
+		return nt_status;
+	}
+
+	(*sam_method)->backendname = "sam_skel";
+
+	/* Functions your SAM module doesn't provide should be set 
+	 * to NULL */
+
+	(*sam_method)->sam_get_sec_desc = sam_skel_get_sec_desc;
+	(*sam_method)->sam_set_sec_desc = sam_skel_set_sec_desc;
+	
+	(*sam_method)->sam_lookup_sid = sam_skel_lookup_sid;
+	(*sam_method)->sam_lookup_name = sam_skel_lookup_name;
+	
+	/* Domain API */
+
+	(*sam_method)->sam_update_domain = sam_skel_update_domain;
+	(*sam_method)->sam_get_domain_handle = sam_skel_get_domain_handle;
+
+	/* Account API */
+
+	(*sam_method)->sam_create_account = sam_skel_create_account;
+	(*sam_method)->sam_add_account = sam_skel_add_account;
+	(*sam_method)->sam_update_account = sam_skel_update_account;
+	(*sam_method)->sam_delete_account = sam_skel_delete_account;
+	(*sam_method)->sam_enum_accounts = sam_skel_enum_accounts;
+
+	(*sam_method)->sam_get_account_by_sid = sam_skel_get_account_by_sid;
+	(*sam_method)->sam_get_account_by_name = sam_skel_get_account_by_name;
+
+	/* Group API */
+
+	(*sam_method)->sam_create_group = sam_skel_create_group;
+	(*sam_method)->sam_add_group = sam_skel_add_group;
+	(*sam_method)->sam_update_group = sam_skel_update_group;
+	(*sam_method)->sam_delete_group = sam_skel_delete_group;
+	(*sam_method)->sam_enum_groups = sam_skel_enum_groups;
+	(*sam_method)->sam_get_group_by_sid = sam_skel_get_group_by_sid;
+	(*sam_method)->sam_get_group_by_name = sam_skel_get_group_by_name;
+
+	(*sam_method)->sam_add_member_to_group = sam_skel_add_member_to_group;
+	(*sam_method)->sam_delete_member_from_group = sam_skel_delete_member_from_group;
+	(*sam_method)->sam_enum_groupmembers = sam_skel_enum_groupmembers;
+
+	(*sam_method)->sam_get_groups_of_account = sam_skel_get_groups_of_account;
+
+	(*sam_method)->free_private_data = NULL;
+
+
+	sam_skel_debug_level = debug_add_class("sam_skel");
+	if (sam_skel_debug_level == -1) {
+		sam_skel_debug_level = DBGC_ALL;
+		DEBUG(0, ("sam_skel: Couldn't register custom debugging class!\n"));
+	} else DEBUG(0, ("sam_skel: Debug class number of 'sam_skel': %d\n", sam_skel_debug_level));
+    
+	DEBUG(0, ("Initializing sam_skel\n"));
+	if (location)
+		DEBUG(10, ("Location: %s\n", location));
+
+	return NT_STATUS_OK;
+}


More information about the samba-technical mailing list