This should cure the problem with gums not compiling.
authorSimo Sorce <idra@samba.org>
Thu, 29 Jan 2004 08:48:50 +0000 (08:48 +0000)
committerSimo Sorce <idra@samba.org>
Thu, 29 Jan 2004 08:48:50 +0000 (08:48 +0000)
(This used to be commit 428504b5508e9e0f9cbc0dc8041f25f06de52f88)

source3/sam/gums_api.c

index a76aed18fdc6bfb768ad6236e7b10473e8870822..f90cbbc951b48cc00cee385ad371d844384641dd 100644 (file)
 
 NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type)
 {
-       TALLOC_CTX *mem_ctx = talloc_init("gums_create_object");
+       TALLOC_CTX *mem_ctx;
        GUMS_OBJECT *go;
        NTSTATUS ret;
-       
+
+               mem_ctx = talloc_init("gums_create_object");
+       if (!mem_ctx) {
+               DEBUG(0, ("gums_create_object: Out of memory!\n"));
+               *obj = NULL;
+               return NT_STATUS_NO_MEMORY;
+       }
+
        go = talloc_zero(mem_ctx, sizeof(GUMS_OBJECT));
+       if (!go) {
+               DEBUG(0, ("gums_create_object: Out of memory!\n"));
+               talloc_destroy(mem_ctx);
+               *obj = NULL;
+               return NT_STATUS_NO_MEMORY;
+       }
+
        go->mem_ctx = mem_ctx;
        go->type = type;
        go->version = GUMS_OBJECT_VERSION;
 
        switch(type) {
                case GUMS_OBJ_DOMAIN:
-                       go->data.domain = (GUMS_DOMAIN *)talloc_zero(mem_ctx, sizeof(GUMS_DOMAIN));
+                       go->domain = (GUMS_DOMAIN *)talloc_zero(mem_ctx, sizeof(GUMS_DOMAIN));
+                       if (!(go->domain)) {
+                               ret = NT_STATUS_NO_MEMORY;
+                               DEBUG(0, ("gums_create_object: Out of memory!\n"));
+                               goto error;
+                       }
+
                        break;
 
 /*
@@ -44,16 +64,26 @@ NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type)
                case GUMS_OBJ_DOMAIN_TRUST:
 */
                case GUMS_OBJ_NORMAL_USER:
-                       go->data.user = (GUMS_USER *)talloc_zero(mem_ctx, sizeof(GUMS_USER));
+                       go->user = (GUMS_USER *)talloc_zero(mem_ctx, sizeof(GUMS_USER));
+                       if (!(go->user)) {
+                               ret = NT_STATUS_NO_MEMORY;
+                               DEBUG(0, ("gums_create_object: Out of memory!\n"));
+                               goto error;
+                       }
+                       gums_set_user_acct_ctrl(go, ACB_NORMAL);
+                       gums_set_user_hours(go, 0, NULL);
+
                        break;
 
                case GUMS_OBJ_GROUP:
                case GUMS_OBJ_ALIAS:
-                       go->data.group = (GUMS_GROUP *)talloc_zero(mem_ctx, sizeof(GUMS_GROUP));
-                       break;
+                       go->group = (GUMS_GROUP *)talloc_zero(mem_ctx, sizeof(GUMS_GROUP));
+                       if (!(go->group)) {
+                               ret = NT_STATUS_NO_MEMORY;
+                               DEBUG(0, ("gums_create_object: Out of memory!\n"));
+                               goto error;
+                       }
 
-               case GUMS_OBJ_PRIVILEGE:
-                       go->data.priv = (GUMS_PRIVILEGE *)talloc_zero(mem_ctx, sizeof(GUMS_PRIVILEGE));
                        break;
 
                default:
@@ -62,18 +92,6 @@ NTSTATUS gums_create_object(GUMS_OBJECT **obj, uint32 type)
                        goto error;
        }
 
-       if (!(go->data.user)) {
-               ret = NT_STATUS_NO_MEMORY;
-               DEBUG(0, ("gums_create_object: Out of memory!\n"));
-               goto error;
-       }
-
-       switch(type) {
-               case GUMS_OBJ_NORMAL_USER:
-                       gums_set_user_acct_ctrl(go, ACB_NORMAL);
-                       gums_set_user_hours(go, 0, NULL);
-       }
-
        *obj = go;
        return NT_STATUS_OK;
 
@@ -83,6 +101,33 @@ error:
        return ret;
 }
 
+NTSTATUS gums_create_privilege(GUMS_PRIVILEGE **priv)
+{
+       TALLOC_CTX *mem_ctx;
+       GUMS_PRIVILEGE *pri;
+
+               mem_ctx = talloc_init("gums_create_privilege");
+       if (!mem_ctx) {
+               DEBUG(0, ("gums_create_privilege: Out of memory!\n"));
+               *priv = NULL;
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       pri = talloc_zero(mem_ctx, sizeof(GUMS_PRIVILEGE));
+       if (!pri) {
+               DEBUG(0, ("gums_create_privilege: Out of memory!\n"));
+               talloc_destroy(mem_ctx);
+               *priv = NULL;
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       pri->mem_ctx = mem_ctx;
+       pri->version = GUMS_PRIVILEGE_VERSION;
+
+       *priv = pri;
+       return NT_STATUS_OK;
+}
+
 NTSTATUS gums_destroy_object(GUMS_OBJECT **obj)
 {
        if (!obj || !(*obj))
@@ -95,6 +140,18 @@ NTSTATUS gums_destroy_object(GUMS_OBJECT **obj)
        return NT_STATUS_OK;
 }
 
+NTSTATUS gums_destroy_privilege(GUMS_PRIVILEGE **priv)
+{
+       if (!priv || !(*priv))
+               return NT_STATUS_INVALID_PARAMETER;
+
+       if ((*priv)->mem_ctx)
+               talloc_destroy((*priv)->mem_ctx);
+       *priv = NULL;
+
+       return NT_STATUS_OK;
+}
+
 void gums_reset_object(GUMS_OBJECT *go)
 {
        go->seq_num = 0;
@@ -104,7 +161,7 @@ void gums_reset_object(GUMS_OBJECT *go)
 
        switch(go->type) {
                case GUMS_OBJ_DOMAIN:
-                       memset(go->data.domain, 0, sizeof(GUMS_DOMAIN));
+                       memset(go->domain, 0, sizeof(GUMS_DOMAIN));
                        break;
 
 /*
@@ -113,17 +170,13 @@ void gums_reset_object(GUMS_OBJECT *go)
                case GUMS_OBJ_DOMAIN_TRUST:
 */
                case GUMS_OBJ_NORMAL_USER:
-                       memset(go->data.user, 0, sizeof(GUMS_USER));
+                       memset(go->user, 0, sizeof(GUMS_USER));
                        gums_set_user_acct_ctrl(go, ACB_NORMAL);
                        break;
 
                case GUMS_OBJ_GROUP:
                case GUMS_OBJ_ALIAS:
-                       memset(go->data.group, 0, sizeof(GUMS_GROUP));
-                       break;
-
-               case GUMS_OBJ_PRIVILEGE:
-                       memset(go->data.priv, 0, sizeof(GUMS_PRIVILEGE));
+                       memset(go->group, 0, sizeof(GUMS_GROUP));
                        break;
 
                default:
@@ -261,7 +314,7 @@ uint32 gums_get_domain_next_rid(const GUMS_OBJECT *obj)
        if (obj->type != GUMS_OBJ_DOMAIN)
                return -1;
 
-       return obj->data.domain->next_rid;
+       return obj->domain->next_rid;
 }
 
 NTSTATUS gums_set_domain_next_rid(GUMS_OBJECT *obj, uint32 rid)
@@ -272,7 +325,7 @@ NTSTATUS gums_set_domain_next_rid(GUMS_OBJECT *obj, uint32 rid)
        if (obj->type != GUMS_OBJ_DOMAIN)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.domain->next_rid = rid;
+       obj->domain->next_rid = rid;
        return NT_STATUS_OK;
 }
 
@@ -283,7 +336,7 @@ const DOM_SID *gums_get_user_pri_group(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return  obj->data.user->group_sid;
+       return  obj->user->group_sid;
 }
 
 const DATA_BLOB gums_get_user_nt_pwd(const GUMS_OBJECT *obj)
@@ -293,10 +346,10 @@ const DATA_BLOB gums_get_user_nt_pwd(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return data_blob(NULL, 0);
 
-       smbpasswd_sethexpwd(p, (unsigned char *)(obj->data.user->nt_pw.data), 0);
+       smbpasswd_sethexpwd(p, (unsigned char *)(obj->user->nt_pw.data), 0);
        DEBUG(100, ("Reading NT Password=[%s]\n", p));
 
-       return obj->data.user->nt_pw;
+       return obj->user->nt_pw;
 }
 
 const DATA_BLOB gums_get_user_lm_pwd(const GUMS_OBJECT *obj)
@@ -306,10 +359,10 @@ const DATA_BLOB gums_get_user_lm_pwd(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return data_blob(NULL, 0);
 
-       smbpasswd_sethexpwd(p, (unsigned char *)(obj->data.user->lm_pw.data), 0);
+       smbpasswd_sethexpwd(p, (unsigned char *)(obj->user->lm_pw.data), 0);
        DEBUG(100, ("Reading LM Password=[%s]\n", p));
 
-       return obj->data.user->lm_pw;
+       return obj->user->lm_pw;
 }
 
 const char *gums_get_user_fullname(const GUMS_OBJECT *obj)
@@ -317,7 +370,7 @@ const char *gums_get_user_fullname(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->full_name;
+       return obj->user->full_name;
 }
 
 const char *gums_get_user_homedir(const GUMS_OBJECT *obj)
@@ -325,7 +378,7 @@ const char *gums_get_user_homedir(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->home_dir;
+       return obj->user->home_dir;
 }
 
 const char *gums_get_user_dir_drive(const GUMS_OBJECT *obj)
@@ -333,7 +386,7 @@ const char *gums_get_user_dir_drive(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->dir_drive;
+       return obj->user->dir_drive;
 }
 
 const char *gums_get_user_profile_path(const GUMS_OBJECT *obj)
@@ -341,7 +394,7 @@ const char *gums_get_user_profile_path(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->profile_path;
+       return obj->user->profile_path;
 }
 
 const char *gums_get_user_logon_script(const GUMS_OBJECT *obj)
@@ -349,7 +402,7 @@ const char *gums_get_user_logon_script(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->logon_script;
+       return obj->user->logon_script;
 }
 
 const char *gums_get_user_workstations(const GUMS_OBJECT *obj)
@@ -357,7 +410,7 @@ const char *gums_get_user_workstations(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->workstations;
+       return obj->user->workstations;
 }
 
 const char *gums_get_user_unknown_str(const GUMS_OBJECT *obj)
@@ -365,7 +418,7 @@ const char *gums_get_user_unknown_str(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->unknown_str;
+       return obj->user->unknown_str;
 }
 
 const char *gums_get_user_munged_dial(const GUMS_OBJECT *obj)
@@ -373,7 +426,7 @@ const char *gums_get_user_munged_dial(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->munged_dial;
+       return obj->user->munged_dial;
 }
 
 NTTIME gums_get_user_logon_time(const GUMS_OBJECT *obj)
@@ -384,7 +437,7 @@ NTTIME gums_get_user_logon_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->logon_time;
+       return obj->user->logon_time;
 }
 
 NTTIME gums_get_user_logoff_time(const GUMS_OBJECT *obj)
@@ -395,7 +448,7 @@ NTTIME gums_get_user_logoff_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->logoff_time;
+       return obj->user->logoff_time;
 }
 
 NTTIME gums_get_user_kickoff_time(const GUMS_OBJECT *obj)
@@ -406,7 +459,7 @@ NTTIME gums_get_user_kickoff_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->kickoff_time;
+       return obj->user->kickoff_time;
 }
 
 NTTIME gums_get_user_pass_last_set_time(const GUMS_OBJECT *obj)
@@ -417,7 +470,7 @@ NTTIME gums_get_user_pass_last_set_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->pass_last_set_time;
+       return obj->user->pass_last_set_time;
 }
 
 NTTIME gums_get_user_pass_can_change_time(const GUMS_OBJECT *obj)
@@ -428,7 +481,7 @@ NTTIME gums_get_user_pass_can_change_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->pass_can_change_time;
+       return obj->user->pass_can_change_time;
 }
 
 NTTIME gums_get_user_pass_must_change_time(const GUMS_OBJECT *obj)
@@ -439,7 +492,7 @@ NTTIME gums_get_user_pass_must_change_time(const GUMS_OBJECT *obj)
                return null_time;
        }
 
-       return obj->data.user->pass_must_change_time;
+       return obj->user->pass_must_change_time;
 }
 
 uint16 gums_get_user_acct_ctrl(const GUMS_OBJECT *obj)
@@ -447,7 +500,7 @@ uint16 gums_get_user_acct_ctrl(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->acct_ctrl;
+       return obj->user->acct_ctrl;
 }
 
 uint16 gums_get_user_logon_divs(const GUMS_OBJECT *obj)
@@ -455,7 +508,7 @@ uint16 gums_get_user_logon_divs(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->logon_divs;
+       return obj->user->logon_divs;
 }
 
 uint32 gums_get_user_hours_len(const GUMS_OBJECT *obj)
@@ -463,7 +516,7 @@ uint32 gums_get_user_hours_len(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->hours_len;
+       return obj->user->hours_len;
 }
 
 const uint8 *gums_get_user_hours(const GUMS_OBJECT *obj)
@@ -471,7 +524,15 @@ const uint8 *gums_get_user_hours(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return NULL;
 
-       return obj->data.user->hours;
+       return obj->user->hours;
+}
+
+uint32 gums_get_user_unknown_3(const GUMS_OBJECT *obj)
+{
+       if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
+               return 0;
+
+       return obj->user->unknown_3;
 }
 
 uint16 gums_get_user_bad_password_count(const GUMS_OBJECT *obj)
@@ -479,7 +540,7 @@ uint16 gums_get_user_bad_password_count(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->bad_password_count;
+       return obj->user->bad_password_count;
 }
 
 uint16 gums_get_user_logon_count(const GUMS_OBJECT *obj)
@@ -487,7 +548,7 @@ uint16 gums_get_user_logon_count(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->logon_count;
+       return obj->user->logon_count;
 }
 
 uint32 gums_get_user_unknown_6(const GUMS_OBJECT *obj)
@@ -495,7 +556,7 @@ uint32 gums_get_user_unknown_6(const GUMS_OBJECT *obj)
        if (!obj || obj->type != GUMS_OBJ_NORMAL_USER)
                return 0;
 
-       return obj->data.user->unknown_6;
+       return obj->user->unknown_6;
 }
 
 NTSTATUS gums_set_user_pri_group(GUMS_OBJECT *obj, const DOM_SID *sid)
@@ -506,8 +567,8 @@ NTSTATUS gums_set_user_pri_group(GUMS_OBJECT *obj, const DOM_SID *sid)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->group_sid = sid_dup_talloc(obj->mem_ctx, sid);
-       if (!(obj->data.user->group_sid)) return NT_STATUS_NO_MEMORY;
+       obj->user->group_sid = sid_dup_talloc(obj->mem_ctx, sid);
+       if (!(obj->user->group_sid)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -522,7 +583,7 @@ NTSTATUS gums_set_user_nt_pwd(GUMS_OBJECT *obj, const DATA_BLOB nt_pwd)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->nt_pw = data_blob_talloc(obj->mem_ctx, nt_pwd.data, nt_pwd.length);
+       obj->user->nt_pw = data_blob_talloc(obj->mem_ctx, nt_pwd.data, nt_pwd.length);
 
        memcpy(r, nt_pwd.data, 16);
        smbpasswd_sethexpwd(p, r, 0);
@@ -542,7 +603,7 @@ NTSTATUS gums_set_user_lm_pwd(GUMS_OBJECT *obj, const DATA_BLOB lm_pwd)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->lm_pw = data_blob_talloc(obj->mem_ctx, lm_pwd.data, lm_pwd.length);
+       obj->user->lm_pw = data_blob_talloc(obj->mem_ctx, lm_pwd.data, lm_pwd.length);
 
        memcpy(r, lm_pwd.data, 16);
        smbpasswd_sethexpwd(p, r, 0);
@@ -559,8 +620,8 @@ NTSTATUS gums_set_user_fullname(GUMS_OBJECT *obj, const char *fullname)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->full_name = (char *)talloc_strdup(obj->mem_ctx, fullname);
-       if (!(obj->data.user->full_name)) return NT_STATUS_NO_MEMORY;
+       obj->user->full_name = (char *)talloc_strdup(obj->mem_ctx, fullname);
+       if (!(obj->user->full_name)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -572,8 +633,8 @@ NTSTATUS gums_set_user_homedir(GUMS_OBJECT *obj, const char *homedir)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->home_dir = (char *)talloc_strdup(obj->mem_ctx, homedir);
-       if (!(obj->data.user->home_dir)) return NT_STATUS_NO_MEMORY;
+       obj->user->home_dir = (char *)talloc_strdup(obj->mem_ctx, homedir);
+       if (!(obj->user->home_dir)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -585,8 +646,8 @@ NTSTATUS gums_set_user_dir_drive(GUMS_OBJECT *obj, const char *dir_drive)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->dir_drive = (char *)talloc_strdup(obj->mem_ctx, dir_drive);
-       if (!(obj->data.user->dir_drive)) return NT_STATUS_NO_MEMORY;
+       obj->user->dir_drive = (char *)talloc_strdup(obj->mem_ctx, dir_drive);
+       if (!(obj->user->dir_drive)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -598,8 +659,8 @@ NTSTATUS gums_set_user_logon_script(GUMS_OBJECT *obj, const char *logon_script)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->logon_script = (char *)talloc_strdup(obj->mem_ctx, logon_script);
-       if (!(obj->data.user->logon_script)) return NT_STATUS_NO_MEMORY;
+       obj->user->logon_script = (char *)talloc_strdup(obj->mem_ctx, logon_script);
+       if (!(obj->user->logon_script)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -611,8 +672,8 @@ NTSTATUS gums_set_user_profile_path(GUMS_OBJECT *obj, const char *profile_path)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->profile_path = (char *)talloc_strdup(obj->mem_ctx, profile_path);
-       if (!(obj->data.user->profile_path)) return NT_STATUS_NO_MEMORY;
+       obj->user->profile_path = (char *)talloc_strdup(obj->mem_ctx, profile_path);
+       if (!(obj->user->profile_path)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -624,8 +685,8 @@ NTSTATUS gums_set_user_workstations(GUMS_OBJECT *obj, const char *workstations)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->workstations = (char *)talloc_strdup(obj->mem_ctx, workstations);
-       if (!(obj->data.user->workstations)) return NT_STATUS_NO_MEMORY;
+       obj->user->workstations = (char *)talloc_strdup(obj->mem_ctx, workstations);
+       if (!(obj->user->workstations)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -637,8 +698,8 @@ NTSTATUS gums_set_user_unknown_str(GUMS_OBJECT *obj, const char *unknown_str)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->unknown_str = (char *)talloc_strdup(obj->mem_ctx, unknown_str);
-       if (!(obj->data.user->unknown_str)) return NT_STATUS_NO_MEMORY;
+       obj->user->unknown_str = (char *)talloc_strdup(obj->mem_ctx, unknown_str);
+       if (!(obj->user->unknown_str)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -650,8 +711,8 @@ NTSTATUS gums_set_user_munged_dial(GUMS_OBJECT *obj, const char *munged_dial)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->munged_dial = (char *)talloc_strdup(obj->mem_ctx, munged_dial);
-       if (!(obj->data.user->munged_dial)) return NT_STATUS_NO_MEMORY;
+       obj->user->munged_dial = (char *)talloc_strdup(obj->mem_ctx, munged_dial);
+       if (!(obj->user->munged_dial)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
@@ -663,7 +724,7 @@ NTSTATUS gums_set_user_logon_time(GUMS_OBJECT *obj, NTTIME logon_time)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->logon_time = logon_time;
+       obj->user->logon_time = logon_time;
        return NT_STATUS_OK;
 }
 
@@ -675,7 +736,7 @@ NTSTATUS gums_set_user_logoff_time(GUMS_OBJECT *obj, NTTIME logoff_time)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->logoff_time = logoff_time;
+       obj->user->logoff_time = logoff_time;
        return NT_STATUS_OK;
 }
 
@@ -687,7 +748,7 @@ NTSTATUS gums_set_user_kickoff_time(GUMS_OBJECT *obj, NTTIME kickoff_time)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->kickoff_time = kickoff_time;
+       obj->user->kickoff_time = kickoff_time;
        return NT_STATUS_OK;
 }
 
@@ -699,7 +760,7 @@ NTSTATUS gums_set_user_pass_last_set_time(GUMS_OBJECT *obj, NTTIME pass_last_set
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->pass_last_set_time = pass_last_set_time;
+       obj->user->pass_last_set_time = pass_last_set_time;
        return NT_STATUS_OK;
 }
 
@@ -711,7 +772,7 @@ NTSTATUS gums_set_user_pass_can_change_time(GUMS_OBJECT *obj, NTTIME pass_can_ch
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->pass_can_change_time = pass_can_change_time;
+       obj->user->pass_can_change_time = pass_can_change_time;
        return NT_STATUS_OK;
 }
 
@@ -723,7 +784,7 @@ NTSTATUS gums_set_user_pass_must_change_time(GUMS_OBJECT *obj, NTTIME pass_must_
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->pass_must_change_time = pass_must_change_time;
+       obj->user->pass_must_change_time = pass_must_change_time;
        return NT_STATUS_OK;
 }
 
@@ -735,7 +796,7 @@ NTSTATUS gums_set_user_acct_ctrl(GUMS_OBJECT *obj, uint16 acct_ctrl)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->acct_ctrl = acct_ctrl;
+       obj->user->acct_ctrl = acct_ctrl;
        return NT_STATUS_OK;
 }
 
@@ -747,7 +808,7 @@ NTSTATUS gums_set_user_logon_divs(GUMS_OBJECT *obj, uint16 logon_divs)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->logon_divs = logon_divs;
+       obj->user->logon_divs = logon_divs;
        return NT_STATUS_OK;
 }
 
@@ -759,19 +820,31 @@ NTSTATUS gums_set_user_hours(GUMS_OBJECT *obj, uint32 hours_len, const uint8 *ho
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->hours_len = hours_len;
+       obj->user->hours_len = hours_len;
        if (hours_len == 0)
                DEBUG(10, ("gums_set_user_hours: Warning, hours_len is zero!\n"));
 
-       obj->data.user->hours = (uint8 *)talloc(obj->mem_ctx, MAX_HOURS_LEN);
-       if (!(obj->data.user->hours))
+       obj->user->hours = (uint8 *)talloc(obj->mem_ctx, MAX_HOURS_LEN);
+       if (!(obj->user->hours))
                return NT_STATUS_NO_MEMORY;
        if (hours_len)
-               memcpy(obj->data.user->hours, hours, hours_len);
+               memcpy(obj->user->hours, hours, hours_len);
 
        return NT_STATUS_OK;
 }
 
+NTSTATUS gums_set_user_unknown_3(GUMS_OBJECT *obj, uint32 unknown_3)
+{
+       if (!obj)
+               return NT_STATUS_INVALID_PARAMETER;
+
+       if (obj->type != GUMS_OBJ_NORMAL_USER)
+               return NT_STATUS_OBJECT_TYPE_MISMATCH;
+
+       obj->user->unknown_3 = unknown_3;
+       return NT_STATUS_OK;
+}
+
 NTSTATUS gums_set_user_bad_password_count(GUMS_OBJECT *obj, uint16 bad_password_count)
 {
        if (!obj)
@@ -780,7 +853,7 @@ NTSTATUS gums_set_user_bad_password_count(GUMS_OBJECT *obj, uint16 bad_password_
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->bad_password_count = bad_password_count;
+       obj->user->bad_password_count = bad_password_count;
        return NT_STATUS_OK;
 }
 
@@ -792,7 +865,7 @@ NTSTATUS gums_set_user_logon_count(GUMS_OBJECT *obj, uint16 logon_count)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->logon_count = logon_count;
+       obj->user->logon_count = logon_count;
        return NT_STATUS_OK;
 }
 
@@ -804,7 +877,7 @@ NTSTATUS gums_set_user_unknown_6(GUMS_OBJECT *obj, uint32 unknown_6)
        if (obj->type != GUMS_OBJ_NORMAL_USER)
                return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.user->unknown_6 = unknown_6;
+       obj->user->unknown_6 = unknown_6;
        return NT_STATUS_OK;
 }
 
@@ -817,8 +890,8 @@ const DOM_SID *gums_get_group_members(int *count, const GUMS_OBJECT *obj)
                return NULL;
        }
 
-       *count = obj->data.group->count;
-       return obj->data.group->members;
+       *count = obj->group->count;
+       return obj->group->members;
 }
 
 NTSTATUS gums_set_group_members(GUMS_OBJECT *obj, uint32 count, DOM_SID *members)
@@ -832,22 +905,22 @@ NTSTATUS gums_set_group_members(GUMS_OBJECT *obj, uint32 count, DOM_SID *members
                obj->type != GUMS_OBJ_ALIAS)
                        return NT_STATUS_OBJECT_TYPE_MISMATCH;
 
-       obj->data.group->count = count;
+       obj->group->count = count;
 
        if (count) {
-               obj->data.group->members = (DOM_SID *)talloc(obj->mem_ctx, count * sizeof(DOM_SID));
-               if (!(obj->data.group->members)) {
+               obj->group->members = (DOM_SID *)talloc(obj->mem_ctx, count * sizeof(DOM_SID));
+               if (!(obj->group->members)) {
                        return NT_STATUS_NO_MEMORY;
                }
 
 
                n = 0;
                do {
-                       sid_copy(&(obj->data.group->members[n]), &(members[n]));
+                       sid_copy(&(obj->group->members[n]), &(members[n]));
                        n++;
                } while (n < count);
        } else {
-               obj->data.group->members = 0;
+               obj->group->members = 0;
        }
 
        return NT_STATUS_OK;
@@ -855,56 +928,51 @@ NTSTATUS gums_set_group_members(GUMS_OBJECT *obj, uint32 count, DOM_SID *members
 
 /* Privilege specific functions */
 
-const LUID_ATTR *gums_get_priv_luid_attr(const GUMS_OBJECT *obj)
+const LUID_ATTR *gums_get_priv_luid_attr(const GUMS_PRIVILEGE *priv)
 {
-       if (!obj || obj->type != GUMS_OBJ_PRIVILEGE)
+       if (!priv) {
                return NULL;
+       }
 
-       return obj->data.priv->privilege;
+       return priv->privilege;
 }
 
-const DOM_SID *gums_get_priv_members(int *count, const GUMS_OBJECT *obj)
+const DOM_SID *gums_get_priv_members(int *count, const GUMS_PRIVILEGE *priv)
 {
-       if (!count || !obj || obj->type != GUMS_OBJ_PRIVILEGE) {
+       if (!count || !priv) {
                *count = -1;
                return NULL;
        }
 
-       *count = obj->data.priv->count;
-       return obj->data.priv->members;
+       *count = priv->count;
+       return priv->members;
 }
 
-NTSTATUS gums_set_priv_luid_attr(GUMS_OBJECT *obj, LUID_ATTR *luid_attr)
+NTSTATUS gums_set_priv_luid_attr(GUMS_PRIVILEGE *priv, LUID_ATTR *luid_attr)
 {
-       if (!luid_attr || !obj)
+       if (!luid_attr || !priv)
                return NT_STATUS_INVALID_PARAMETER;
 
-       if (obj->type != GUMS_OBJ_PRIVILEGE)
-               return NT_STATUS_OBJECT_TYPE_MISMATCH;
-
-       obj->data.priv->privilege = (LUID_ATTR *)talloc_memdup(obj->mem_ctx, luid_attr, sizeof(LUID_ATTR));
-       if (!(obj->data.priv->privilege)) return NT_STATUS_NO_MEMORY;
+       priv->privilege = (LUID_ATTR *)talloc_memdup(priv->mem_ctx, luid_attr, sizeof(LUID_ATTR));
+       if (!(priv->privilege)) return NT_STATUS_NO_MEMORY;
        return NT_STATUS_OK;
 }
 
-NTSTATUS gums_set_priv_members(GUMS_OBJECT *obj, uint32 count, DOM_SID *members)
+NTSTATUS gums_set_priv_members(GUMS_PRIVILEGE *priv, uint32 count, DOM_SID *members)
 {
        uint32 n;
 
-       if (!obj || !members || !members)
+       if (!priv || !members || !members)
                return NT_STATUS_INVALID_PARAMETER;
 
-       if (obj->type != GUMS_OBJ_PRIVILEGE)
-               return NT_STATUS_OBJECT_TYPE_MISMATCH;
-
-       obj->data.priv->count = count;
-       obj->data.priv->members = (DOM_SID *)talloc(obj->mem_ctx, count * sizeof(DOM_SID));
-       if (!(obj->data.priv->members))
+       priv->count = count;
+       priv->members = (DOM_SID *)talloc(priv->mem_ctx, count * sizeof(DOM_SID));
+       if (!(priv->members))
                return NT_STATUS_NO_MEMORY;
 
        n = 0;
        do {
-               sid_copy(&(obj->data.priv->members[n]), &(members[n]));
+               sid_copy(&(priv->members[n]), &(members[n]));
                n++;
        } while (n < count);