Hi Andrew,

here're the first steps of my pdb_set_* patch (THIS is NOT ready!!!)

every pdb_set function gets a uint8 flag (DEFAULT | SET | CHANGED)

then the backends can decide to only store changed values...


metze
-----------------------------------------------------------------------------
Stefan "metze" Metzmacher <[EMAIL PROTECTED]>
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* 
HEAD/source/include/smb.h HEAD-pdb/source/include/smb.h
--- HEAD/source/include/smb.h   Mon Oct  7 06:58:17 2002
+++ HEAD-pdb/source/include/smb.h       Mon Oct  7 09:55:35 2002
@@ -569,25 +569,67 @@ typedef struct {
 /*
  * bit flags representing initialized fields in SAM_ACCOUNT
  */
-#define FLAG_SAM_UNINIT                0x00000000
-#define FLAG_SAM_UID           0x00000001
-#define FLAG_SAM_GID           0x00000002
-#define FLAG_SAM_SMBHOME       0x00000004
-#define FLAG_SAM_PROFILE       0x00000008
-#define FLAG_SAM_DRIVE          0x00000010
-#define FLAG_SAM_LOGONSCRIPT   0x00000020
-#define FLAG_SAM_LOGONTIME     0x00000040
-#define FLAG_SAM_LOGOFFTIME    0x00000080
-#define FLAG_SAM_KICKOFFTIME   0x00000100
-#define FLAG_SAM_CANCHANGETIME 0x00000200
-#define FLAG_SAM_MUSTCHANGETIME        0x00000400
-#define FLAG_SAM_PLAINTEXT_PW   0x00000800
+#define FLAG_SAM_UNINIT                        0x00000000
+#define FLAG_SAM_USERNAME_CHANGED      0x00000001
+#define FLAG_SAM_FULLNAME_CHANGED      0x00000002
+#define FLAG_SAM_DOMAIN_DEFAULT                0x00000003
+#define FLAG_SAM_DOMAIN_CHANGED                0x00000004
+#define FLAG_SAM_NTUSERNAME_CHANGED    0x00000005
+#define FLAG_SAM_ACCTDESC_CHANGED      0x00000006
+#define FLAG_SAM_UID_SET               0x00000007
+#define FLAG_SAM_UID_CHANGED           0x00000008
+#define FLAG_SAM_GID_SET               0x00000009
+#define FLAG_SAM_GID_CHANGED           0x0000000A
+#define FLAG_SAM_USERSID_SET           0x0000000B
+#define FLAG_SAM_USERSID_CHANGED       0x0000000C
+#define FLAG_SAM_GROUPSID_SET          0x0000000D
+#define FLAG_SAM_GROUPSID_CHANGED      0x0000000E
+#define FLAG_SAM_ACCTCTRL_CHANGED      0x0000000F
+#define FLAG_SAM_SMBHOME_DEFAULT       0x00000010
+#define FLAG_SAM_SMBHOME_CHANGED       0x00000011
+#define FLAG_SAM_PROFILE_DEFAULT       0x00000012
+#define FLAG_SAM_PROFILE_CHANGED       0x00000013
+#define FLAG_SAM_DRIVE_DEFAULT         0x00000014
+#define FLAG_SAM_DRIVE_CHANGED         0x00000015
+#define FLAG_SAM_LOGONSCRIPT_DEFAULT   0x00000016
+#define FLAG_SAM_LOGONSCRIPT_CHANGED   0x00000017
+#define FLAG_SAM_HOURS_CHANGED         0x00000018
+#define FLAG_SAM_HOURS_DEFAULT         0x00000019
+#define FLAG_SAM_HOURSLEN_CHANGED      0x0000001A
+#define FLAG_SAM_HOURSLEN_DEFAULT      0x0000001B
+#define FLAG_SAM_LOGONDIVS_CHANGED     0x0000001C
+#define FLAG_SAM_UNIXHOMEDIR_CHANGED   0x0000001D
+#define FLAG_SAM_WORKSTATIONS_CHANGED  0x0000001E
+#define FLAG_SAM_MUNGEDDIAL_CHANGED    0x0000001F
+#define FLAG_SAM_PLAINTEXT_PW_CHANGED  0x00000020
+#define FLAG_SAM_LMPASSWD_CHANGED      0x00000021
+#define FLAG_SAM_NTPASSWD_CHANGED      0x00000022
+#define FLAG_SAM_PASSLASTSET_CHANGED   0x00000023
+#define FLAG_SAM_CANCHANGETIME_DEFAULT 0x00000024
+#define FLAG_SAM_CANCHANGETIME_CHANGED 0x00000025
+#define FLAG_SAM_MUSTCHANGETIME_DEFAULT        0x00000026
+#define FLAG_SAM_MUSTCHANGETIME_CHANGED        0x00000027
+#define FLAG_SAM_LOGONTIME_DEFAULT     0x00000028
+#define FLAG_SAM_LOGONTIME_CHANGED     0x00000029
+#define FLAG_SAM_LOGOFFTIME_DEFAULT    0x0000002A
+#define FLAG_SAM_LOGOFFTIME_CHANGED    0x0000002B
+#define FLAG_SAM_KICKOFFTIME_DEFAULT   0x0000002C
+#define FLAG_SAM_KICKOFFTIME_CHANGED   0x0000002D
+#define FLAG_SAM_UNKNOWNSTR_CHANGED    0x0000002E
+#define FLAG_SAM_UNKNOWN3_CHANGED      0x0000002F
+#define FLAG_SAM_UNKNOWN5_CHANGED      0x00000030
+#define FLAG_SAM_UNKNOWN6_CHANGED      0x00000031
+
+/* if you add a flag increment FLAG_SAM_COUNT */
+#define FLAG_SAM_COUNT                 0x00000031
+
+enum(DEFAULT,SET,CHANGED);
 
 #define IS_SAM_UNIX_USER(x) \
-       ((pdb_get_init_flag(x) & FLAG_SAM_UID) \
-        && (pdb_get_init_flag(x) & FLAG_SAM_GID))
+       ((pdb_get_init_flag(x,FLAG_SAM_UID_SET) \
+        && (pdb_get_init_flag(x,FLAG_SAM_GID_SET)))
 
-#define IS_SAM_SET(x, flag)    ((x)->private.init_flag & (flag))
+#define IS_SAM_SET(x, flag)    pdb_get_init_flag(x, flag)
                
 typedef struct sam_passwd
 {
@@ -599,7 +641,7 @@ typedef struct sam_passwd
 
        struct user_data {
                /* initiailization flags */
-               uint32 init_flag;
+               struct bitmap *init_flag;
                
                time_t logon_time;            /* logon time */
                time_t logoff_time;           /* logoff time */
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* 
HEAD/source/include/stamp-h HEAD-pdb/source/include/stamp-h
--- HEAD/source/include/stamp-h Thu Jan  1 01:00:00 1970
+++ HEAD-pdb/source/include/stamp-h     Thu Sep 19 08:33:52 2002
@@ -0,0 +1 @@
+Sun Jul 18 20:32:29 UTC 1999
diff -Npur --exclude=CVS --exclude=*.bak --exclude=*.o --exclude=*.po --exclude=.#* 
HEAD/source/passdb/pdb_get_set.c HEAD-pdb/source/passdb/pdb_get_set.c
--- HEAD/source/passdb/pdb_get_set.c    Fri Sep 27 07:40:04 2002
+++ HEAD-pdb/source/passdb/pdb_get_set.c        Mon Oct  7 09:22:01 2002
@@ -178,12 +178,12 @@ const DOM_SID *pdb_get_group_sid(const S
  * @return the flags indicating the members initialised in the struct.
  **/
  
-uint32 pdb_get_init_flag (const SAM_ACCOUNT *sampass)
+BOOL pdb_get_init_flag (const SAM_ACCOUNT *sampass, uint32 flag)
 {
-        if (sampass)
-               return sampass->private.init_flag;
-       else 
-                return FLAG_SAM_UNINIT;
+        if (!sampass || !sampass->private.init_flags)
+               return False;
+               
+        return bitmap_query(sampass->private.init_flags, flag);
 }
 
 uid_t pdb_get_uid (const SAM_ACCOUNT *sampass)
@@ -334,109 +334,279 @@ uint32 pdb_get_unknown6 (const SAM_ACCOU
  Collection of set...() functions for SAM_ACCOUNT_INFO.
  ********************************************************************/
 
-BOOL pdb_set_acct_ctrl (SAM_ACCOUNT *sampass, uint16 flags)
+BOOL pdb_set_acct_ctrl (SAM_ACCOUNT *sampass, uint16 acct_ctrl, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_ACCTCTRL_CHANGED;
+
        if (!sampass)
                return False;
                
-       if (sampass) {
-               sampass->private.acct_ctrl = flags;
-               return True;
+       sampass->private.acct_ctrl = acct_ctrl;
+
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
        }
-       
+
        return False;
 }
 
-BOOL pdb_set_logon_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_logon_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_LOGONTIME_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_LOGONTIME_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.logon_time = mytime;
 
-       if (store)
-               pdb_set_init_flag(sampass, FLAG_SAM_LOGONTIME); 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       } 
 
        return True;
 }
 
-BOOL pdb_set_logoff_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_logoff_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_LOGOFFTIME_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_LOGOFFTIME_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.logoff_time = mytime;
 
-       if (store)
-               pdb_set_init_flag(sampass, FLAG_SAM_LOGOFFTIME); 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       }
 
        return True;
 }
 
-BOOL pdb_set_kickoff_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_kickoff_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_KICKOFFTIME_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_KICKOFFTIME_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.kickoff_time = mytime;
 
-       if (store)
-               pdb_set_init_flag(sampass, FLAG_SAM_KICKOFFTIME); 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       } 
 
        return True;
 }
 
-BOOL pdb_set_pass_can_change_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_pass_can_change_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_CANCHANGETIME_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_CANCHANGETIME_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.pass_can_change_time = mytime;
 
-       if (store)
-               pdb_set_init_flag(sampass, FLAG_SAM_CANCHANGETIME); 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       } 
 
        return True;
 }
 
-BOOL pdb_set_pass_must_change_time (SAM_ACCOUNT *sampass, time_t mytime, BOOL store)
+BOOL pdb_set_pass_must_change_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_MUSTCHANGETIME_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_MUSTCHANGETIME_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.pass_must_change_time = mytime;
 
-       if (store)
-               pdb_set_init_flag(sampass, FLAG_SAM_MUSTCHANGETIME); 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       }
 
        return True;
 }
 
-BOOL pdb_set_pass_last_set_time (SAM_ACCOUNT *sampass, time_t mytime)
+BOOL pdb_set_pass_last_set_time (SAM_ACCOUNT *sampass, time_t mytime, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_PASSLASTSET_CHANGED;
+
        if (!sampass)
                return False;
 
        sampass->private.pass_last_set_time = mytime;
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
-BOOL pdb_set_hours_len (SAM_ACCOUNT *sampass, uint32 len)
+BOOL pdb_set_hours_len (SAM_ACCOUNT *sampass, uint32 len, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_HOURSLEN_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_HOURSLEN_DEFAULT;
+       
        if (!sampass)
                return False;
 
        sampass->private.hours_len = len;
+
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
-BOOL pdb_set_logon_divs (SAM_ACCOUNT *sampass, uint16 hours)
+BOOL pdb_set_logon_divs (SAM_ACCOUNT *sampass, uint16 hours, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_LOGONDIVS_CHANGED;
+
        if (!sampass)
                return False;
 
        sampass->private.logon_divs = hours;
+
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
@@ -449,16 +619,53 @@ BOOL pdb_set_logon_divs (SAM_ACCOUNT *sa
  
 BOOL pdb_set_init_flag (SAM_ACCOUNT *sampass, uint32 flag)
 {
-        if (!sampass)
+        if (!sampass || !sampass->mem_ctx)
+                return False;
+
+        if (!sampass->private.init_flags) {
+               if ((sampass->private.init_flags = 
+                       bitmap_talloc(sampass->mem_ctx, 
+                                       FLAG_SAM_COUNT))==NULL) {
+                       DEBUG(0,("bitmap_talloc failed\n"));
+                       return False;
+               }
+        }
+
+       if (!bitmap_set(sampass->private.init_flags, flag)) {
+               DEBUG(0,("Can't set flag: %08X\n",flag));
+               return False;
+       }
+
+        return True;
+}
+
+BOOL pdb_unset_init_flag (SAM_ACCOUNT *sampass, uint32 flag)
+{
+        if (!sampass || !sampass->mem_ctx)
                 return False;
 
-        sampass->private.init_flag |= flag;
+        if (!sampass->private.init_flags) {
+               if ((sampass->private.init_flags = 
+                       bitmap_talloc(sampass->mem_ctx, 
+                                       FLAG_SAM_COUNT))==NULL) {
+                       DEBUG(0,("bitmap_talloc failed\n"));
+                       return False;
+               }
+        }
+
+       if (!bitmap_clear(sampass->private.init_flags, flag)) {
+               DEBUG(0,("Can't set flag: %08X\n",flag));
+               return False;
+       }
 
         return True;
 }
 
-BOOL pdb_set_uid (SAM_ACCOUNT *sampass, const uid_t uid)
+BOOL pdb_set_uid (SAM_ACCOUNT *sampass, const uid_t uid, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UID_CHANGED;
+       uint32 sam_flag_set = FLAG_SAM_UID_SET;
+       
        if (!sampass)
                return False;
        
@@ -466,14 +673,37 @@ BOOL pdb_set_uid (SAM_ACCOUNT *sampass, 
                   (int)uid, (int)sampass->private.uid));
  
        sampass->private.uid = uid;
-       pdb_set_init_flag(sampass, FLAG_SAM_UID); 
+       
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+       }
 
        return True;
 
 }
 
-BOOL pdb_set_gid (SAM_ACCOUNT *sampass, const gid_t gid)
+BOOL pdb_set_gid (SAM_ACCOUNT *sampass, const gid_t gid, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_GID_CHANGED;
+       uint32 sam_flag_set = FLAG_SAM_GID_SET;
+       
        if (!sampass)
                return False;
                
@@ -481,14 +711,37 @@ BOOL pdb_set_gid (SAM_ACCOUNT *sampass, 
                   (int)gid, (int)sampass->private.gid));
  
        sampass->private.gid = gid; 
-       pdb_set_init_flag(sampass, FLAG_SAM_GID); 
+
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+       }   
 
        return True;
 
 }
 
-BOOL pdb_set_user_sid (SAM_ACCOUNT *sampass, DOM_SID *u_sid)
+BOOL pdb_set_user_sid (SAM_ACCOUNT *sampass, DOM_SID *u_sid, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_USERSID_CHANGED;
+       uint32 sam_flag_set = FLAG_SAM_USERSID_SET;
+       
        if (!sampass || !u_sid)
                return False;
        
@@ -496,13 +749,35 @@ BOOL pdb_set_user_sid (SAM_ACCOUNT *samp
 
        DEBUG(10, ("pdb_set_user_sid: setting user sid %s\n", 
                    sid_string_static(&sampass->private.user_sid)));
-       
+
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
-BOOL pdb_set_user_sid_from_string (SAM_ACCOUNT *sampass, fstring u_sid)
+BOOL pdb_set_user_sid_from_string (SAM_ACCOUNT *sampass, fstring u_sid, uint8 flag)
 {
        DOM_SID new_sid;
+       
        if (!sampass || !u_sid)
                return False;
 
@@ -514,7 +789,7 @@ BOOL pdb_set_user_sid_from_string (SAM_A
                return False;
        }
         
-       if (!pdb_set_user_sid(sampass, &new_sid)) {
+       if (!pdb_set_user_sid(sampass, &new_sid, flag)) {
                DEBUG(1, ("pdb_set_user_sid_from_string: could not set sid %s on 
SAM_ACCOUNT!\n", u_sid));
                return False;
        }
@@ -522,8 +797,11 @@ BOOL pdb_set_user_sid_from_string (SAM_A
        return True;
 }
 
-BOOL pdb_set_group_sid (SAM_ACCOUNT *sampass, DOM_SID *g_sid)
+BOOL pdb_set_group_sid (SAM_ACCOUNT *sampass, DOM_SID *g_sid, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_GROUPSID_CHANGED;
+       uint32 sam_flag_set = FLAG_SAM_GROUPSID_SET;
+       
        if (!sampass || !g_sid)
                return False;
 
@@ -532,10 +810,31 @@ BOOL pdb_set_group_sid (SAM_ACCOUNT *sam
        DEBUG(10, ("pdb_set_group_sid: setting group sid %s\n", 
                    sid_string_static(&sampass->private.group_sid)));
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_set)
+                               return False;
+                       break;
+       } 
+
        return True;
 }
 
-BOOL pdb_set_group_sid_from_string (SAM_ACCOUNT *sampass, fstring g_sid)
+BOOL pdb_set_group_sid_from_string (SAM_ACCOUNT *sampass, fstring g_sid, uint8 flag)
 {
        DOM_SID new_sid;
        if (!sampass || !g_sid)
@@ -549,7 +848,7 @@ BOOL pdb_set_group_sid_from_string (SAM_
                return False;
        }
         
-       if (!pdb_set_group_sid(sampass, &new_sid)) {
+       if (!pdb_set_group_sid(sampass, &new_sid, flag)) {
                DEBUG(1, ("pdb_set_group_sid_from_string: could not set sid %s on 
SAM_ACCOUNT!\n", g_sid));
                return False;
        }
@@ -560,8 +859,9 @@ BOOL pdb_set_group_sid_from_string (SAM_
  Set the user's UNIX name.
  ********************************************************************/
 
-BOOL pdb_set_username(SAM_ACCOUNT *sampass, const char *username)
-{      
+BOOL pdb_set_username(SAM_ACCOUNT *sampass, const char *username, uint8 flag)
+{
+       uint32 sam_flag_changed = FLAG_SAM_USERNAME_CHANGED;
        if (!sampass)
                return False;
  
@@ -579,6 +879,18 @@ BOOL pdb_set_username(SAM_ACCOUNT *sampa
        } else {
                sampass->private.username = PDB_NOT_QUITE_NULL;
        }
+       
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+       }
 
        return True;
 }
@@ -587,8 +899,11 @@ BOOL pdb_set_username(SAM_ACCOUNT *sampa
  Set the domain name.
  ********************************************************************/
 
-BOOL pdb_set_domain(SAM_ACCOUNT *sampass, const char *domain)
-{      
+BOOL pdb_set_domain(SAM_ACCOUNT *sampass, const char *domain, uint8 flag)
+{
+       uint32 sam_flag_changed = FLAG_SAM_DOMAIN_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_DOMAIN_DEFAULT;
+               
        if (!sampass)
                return False;
 
@@ -607,6 +922,27 @@ BOOL pdb_set_domain(SAM_ACCOUNT *sampass
                sampass->private.domain = PDB_NOT_QUITE_NULL;
        }
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       } 
+       
        return True;
 }
 
@@ -616,6 +952,8 @@ BOOL pdb_set_domain(SAM_ACCOUNT *sampass
 
 BOOL pdb_set_nt_username(SAM_ACCOUNT *sampass, const char *nt_username)
 {
+       uint32 sam_flag_changed = FLAG_SAM_NTUSERNAME_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -634,6 +972,18 @@ BOOL pdb_set_nt_username(SAM_ACCOUNT *sa
                sampass->private.nt_username = PDB_NOT_QUITE_NULL;
        }
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
@@ -643,6 +993,8 @@ BOOL pdb_set_nt_username(SAM_ACCOUNT *sa
 
 BOOL pdb_set_fullname(SAM_ACCOUNT *sampass, const char *full_name)
 {
+       uint32 sam_flag_changed = FLAG_SAM_FULLNAME_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -661,6 +1013,18 @@ BOOL pdb_set_fullname(SAM_ACCOUNT *sampa
                sampass->private.full_name = PDB_NOT_QUITE_NULL;
        }
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+               case DEFAULT:
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
@@ -668,8 +1032,11 @@ BOOL pdb_set_fullname(SAM_ACCOUNT *sampa
  Set the user's logon script.
  ********************************************************************/
 
-BOOL pdb_set_logon_script(SAM_ACCOUNT *sampass, const char *logon_script, BOOL store)
+BOOL pdb_set_logon_script(SAM_ACCOUNT *sampass, const char *logon_script, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_LOGONSCRIPT_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_LOGONSCRIPT_DEFAULT;
+       
        if (!sampass)
                return False;
 
@@ -688,9 +1055,25 @@ BOOL pdb_set_logon_script(SAM_ACCOUNT *s
                sampass->private.logon_script = PDB_NOT_QUITE_NULL;
        }
        
-       if (store) {
-               DEBUG(10, ("pdb_set_logon_script: setting logon script sam flag!\n"));
-               pdb_set_init_flag(sampass, FLAG_SAM_LOGONSCRIPT);
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
        }
 
        return True;
@@ -700,8 +1083,11 @@ BOOL pdb_set_logon_script(SAM_ACCOUNT *s
  Set the user's profile path.
  ********************************************************************/
 
-BOOL pdb_set_profile_path (SAM_ACCOUNT *sampass, const char *profile_path, BOOL store)
+BOOL pdb_set_profile_path (SAM_ACCOUNT *sampass, const char *profile_path, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_PROFILEPATH_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_PROFILEPATH_DEFAULT;
+       
        if (!sampass)
                return False;
 
@@ -720,9 +1106,25 @@ BOOL pdb_set_profile_path (SAM_ACCOUNT *
                sampass->private.profile_path = PDB_NOT_QUITE_NULL;
        }
 
-       if (store) {
-               DEBUG(10, ("pdb_set_profile_path: setting profile path sam flag!\n"));
-               pdb_set_init_flag(sampass, FLAG_SAM_PROFILE);
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
        }
 
        return True;
@@ -732,8 +1134,11 @@ BOOL pdb_set_profile_path (SAM_ACCOUNT *
  Set the user's directory drive.
  ********************************************************************/
 
-BOOL pdb_set_dir_drive (SAM_ACCOUNT *sampass, const char *dir_drive, BOOL store)
+BOOL pdb_set_dir_drive (SAM_ACCOUNT *sampass, const char *dir_drive, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_DIRDRIVE_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_DIRDRIVE_DEFAULT;
+       
        if (!sampass)
                return False;
 
@@ -752,9 +1157,25 @@ BOOL pdb_set_dir_drive (SAM_ACCOUNT *sam
                sampass->private.dir_drive = PDB_NOT_QUITE_NULL;
        }
        
-       if (store) {
-               DEBUG(10, ("pdb_set_dir_drive: setting dir drive sam flag!\n"));
-               pdb_set_init_flag(sampass, FLAG_SAM_DRIVE);
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
        }
 
        return True;
@@ -764,8 +1185,11 @@ BOOL pdb_set_dir_drive (SAM_ACCOUNT *sam
  Set the user's home directory.
  ********************************************************************/
 
-BOOL pdb_set_homedir (SAM_ACCOUNT *sampass, const char *home_dir, BOOL store)
+BOOL pdb_set_homedir (SAM_ACCOUNT *sampass, const char *home_dir, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_HOMEDIR_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_HOMEDIR_DEFAULT;
+       
        if (!sampass)
                return False;
 
@@ -784,9 +1208,25 @@ BOOL pdb_set_homedir (SAM_ACCOUNT *sampa
                sampass->private.home_dir = PDB_NOT_QUITE_NULL;
        }
 
-       if (store) {
-               DEBUG(10, ("pdb_set_homedir: setting home dir sam flag!\n"));
-               pdb_set_init_flag(sampass, FLAG_SAM_SMBHOME);
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
        }
 
        return True;
@@ -796,8 +1236,10 @@ BOOL pdb_set_homedir (SAM_ACCOUNT *sampa
  Set the user's unix home directory.
  ********************************************************************/
 
-BOOL pdb_set_unix_homedir (SAM_ACCOUNT *sampass, const char *unix_home_dir)
+BOOL pdb_set_unix_homedir (SAM_ACCOUNT *sampass, const char *unix_home_dir, uint8 
+flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UNIXHOMEDIR_CHANGED;
+       
        if (!sampass)
                return False;
 
@@ -824,8 +1266,10 @@ BOOL pdb_set_unix_homedir (SAM_ACCOUNT *
  Set the user's account description.
  ********************************************************************/
 
-BOOL pdb_set_acct_desc (SAM_ACCOUNT *sampass, const char *acct_desc)
+BOOL pdb_set_acct_desc (SAM_ACCOUNT *sampass, const char *acct_desc, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_ACCTDESC_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -848,8 +1292,10 @@ BOOL pdb_set_acct_desc (SAM_ACCOUNT *sam
  Set the user's workstation allowed list.
  ********************************************************************/
 
-BOOL pdb_set_workstations (SAM_ACCOUNT *sampass, const char *workstations)
+BOOL pdb_set_workstations (SAM_ACCOUNT *sampass, const char *workstations, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_WORKSTATIONS_CHANGED;
+       
        if (!sampass)
                return False;
 
@@ -875,8 +1321,10 @@ BOOL pdb_set_workstations (SAM_ACCOUNT *
  Set the user's 'unknown_str', whatever the heck this actually is...
  ********************************************************************/
 
-BOOL pdb_set_unknown_str (SAM_ACCOUNT *sampass, const char *unknown_str)
+BOOL pdb_set_unknown_str (SAM_ACCOUNT *sampass, const char *unknown_str, uint8)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UNKNOWNSTR_CHANGED;
+       
        if (!sampass)
                return False;
 
@@ -899,8 +1347,10 @@ BOOL pdb_set_unknown_str (SAM_ACCOUNT *s
  Set the user's dial string.
  ********************************************************************/
 
-BOOL pdb_set_munged_dial (SAM_ACCOUNT *sampass, const char *munged_dial)
+BOOL pdb_set_munged_dial (SAM_ACCOUNT *sampass, const char *munged_dial, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_MUNGEDDIAL_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -923,8 +1373,10 @@ BOOL pdb_set_munged_dial (SAM_ACCOUNT *s
  Set the user's NT hash.
  ********************************************************************/
 
-BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sampass, const uint8 *pwd)
+BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[NT_HASH_LEN], uint8 
+flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_NTPASSWD_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -939,8 +1391,10 @@ BOOL pdb_set_nt_passwd (SAM_ACCOUNT *sam
  Set the user's LM hash.
  ********************************************************************/
 
-BOOL pdb_set_lanman_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[16])
+BOOL pdb_set_lanman_passwd (SAM_ACCOUNT *sampass, const uint8 pwd[LM_HASH_LEN], uint8 
+flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_LMPASSWD_CHANGED;
+       
        if (!sampass)
                return False;
 
@@ -956,8 +1410,10 @@ BOOL pdb_set_lanman_passwd (SAM_ACCOUNT 
  below)
  ********************************************************************/
 
-BOOL pdb_set_plaintext_pw_only (SAM_ACCOUNT *sampass, const char *password)
+BOOL pdb_set_plaintext_pw_only (SAM_ACCOUNT *sampass, const char *password, uint8 
+flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_PLAINTEXT_PW_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -979,8 +1435,10 @@ BOOL pdb_set_plaintext_pw_only (SAM_ACCO
        return True;
 }
 
-BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UNKNOWN3_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -988,8 +1446,10 @@ BOOL pdb_set_unknown_3 (SAM_ACCOUNT *sam
        return True;
 }
 
-BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UNKNOWN5_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -997,8 +1457,10 @@ BOOL pdb_set_unknown_5 (SAM_ACCOUNT *sam
        return True;
 }
 
-BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sampass, uint32 unkn)
+BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sampass, uint32 unkn, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_UNKNOW6_CHANGED;
+
        if (!sampass)
                return False;
 
@@ -1006,8 +1468,11 @@ BOOL pdb_set_unknown_6 (SAM_ACCOUNT *sam
        return True;
 }
 
-BOOL pdb_set_hours (SAM_ACCOUNT *sampass, const uint8 *hours)
+BOOL pdb_set_hours (SAM_ACCOUNT *sampass, const uint8 *hours, uint8 flag)
 {
+       uint32 sam_flag_changed = FLAG_SAM_HOURS_CHANGED;
+       uint32 sam_flag_default = FLAG_SAM_HOURS_DEFAULT;
+       
        if (!sampass)
                return False;
 
@@ -1018,6 +1483,27 @@ BOOL pdb_set_hours (SAM_ACCOUNT *sampass
        
        memcpy (sampass->private.hours, hours, MAX_HOURS_LEN);
 
+       switch(flag) {
+               case CHANGED:
+                       if (!pdb_set_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case SET:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_unset_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+               case DEFAULT:
+                       if (!pdb_unset_init_flag(sampass, sam_flag_changed)
+                               return False;
+                       if (!pdb_set_init_flag(sampass, sam_flag_default)
+                               return False;
+                       break;
+       }
+
        return True;
 }
 
@@ -1041,12 +1527,12 @@ BOOL pdb_set_pass_changed_now (SAM_ACCOU
 
        if (!account_policy_get(AP_MAX_PASSWORD_AGE, &expire) 
            || (expire==(uint32)-1)) {
-               if (!pdb_set_pass_must_change_time (sampass, get_time_t_max(), False))
+               if (!pdb_set_pass_must_change_time (sampass, get_time_t_max(), SET))
                        return False;
        } else {
                if (!pdb_set_pass_must_change_time (sampass, 
                                                    pdb_get_pass_last_set_time(sampass)
-                                                   + expire, True))
+                                                   + expire, CHANGED))
                        return False;
        }
        
@@ -1068,13 +1554,13 @@ BOOL pdb_set_plaintext_passwd (SAM_ACCOU
        
        nt_lm_owf_gen (plaintext, new_nt_p16, new_lanman_p16);
 
-       if (!pdb_set_nt_passwd (sampass, new_nt_p16)) 
+       if (!pdb_set_nt_passwd (sampass, new_nt_p16, CHANGED)) 
                return False;
 
-       if (!pdb_set_lanman_passwd (sampass, new_lanman_p16)) 
+       if (!pdb_set_lanman_passwd (sampass, new_lanman_p16, CHANGED)) 
                return False;
 
-       if (!pdb_set_plaintext_pw_only (sampass, plaintext)) 
+       if (!pdb_set_plaintext_pw_only (sampass, plaintext, CHANGED)) 
                return False;
 
        if (!pdb_set_pass_changed_now (sampass))

Reply via email to