s3:modules/non_posix_acls: only stat if we do not have it cached
[samba.git] / source3 / modules / vfs_aixacl_util.c
index bd5ccbbdc2334103377b010918aed0de45d94d22..1194d27df22b48aeb57a632550aeeb4173e89b3d 100644 (file)
 #include "smbd/smbd.h"
 #include "vfs_aixacl_util.h"
 
-SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
+SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl, TALLOC_CTX *mem_ctx)
 {
        struct acl_entry *acl_entry;
        struct ace_id *idp;
        
-       struct smb_acl_t *result = sys_acl_init(0);
+       struct smb_acl_t *result = sys_acl_init(mem_ctx);
        struct smb_acl_entry *ace;
        int i;
        
@@ -63,7 +63,7 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
                        idp = acl_entry->ace_id;
                        DEBUG(10,("idp->id_data is %d\n",idp->id_data[0]));
                        
-                       result->acl = talloc_realloc(result, result->acl, result->count+1);
+                       result->acl = talloc_realloc(result, result->acl, struct smb_acl_entry, result->count+1);
                        if (result == NULL) {
                                DEBUG(0, ("talloc_realloc failed\n"));
                                errno = ENOMEM;
@@ -78,15 +78,15 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
                                                        
                        switch(ace->a_type) {
                        case ACEID_USER: {
-                       ace->uid = idp->id_data[0];
-                       DEBUG(10,("case ACEID_USER ace->uid is %d\n",ace->uid));
+                       ace->info.user.uid = idp->id_data[0];
+                       DEBUG(10,("case ACEID_USER ace->info.user.uid is %d\n",ace->info.user.uid));
                        ace->a_type = SMB_ACL_USER;
                        break;
                        }
                
                        case ACEID_GROUP: {
-                       ace->gid = idp->id_data[0];
-                       DEBUG(10,("case ACEID_GROUP ace->gid is %d\n",ace->gid));
+                       ace->info.group.gid = idp->id_data[0];
+                       DEBUG(10,("case ACEID_GROUP ace->info.group.gid is %d\n",ace->info.group.gid));
                        ace->a_type = SMB_ACL_GROUP;
                        break;
                        }
@@ -138,7 +138,7 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
        for( i = 1; i < 4; i++) {
                DEBUG(10,("i is %d\n",i));
 
-               result->acl = talloc_realloc(result, result->acl, result->count+1);
+               result->acl = talloc_realloc(result, result->acl, struct smb_acl_entry, result->count+1);
                if (result->acl == NULL) {
                        TALLOC_FREE(result);
                        DEBUG(0, ("talloc_realloc failed\n"));
@@ -149,9 +149,9 @@ SMB_ACL_T aixacl_to_smbacl(struct acl *file_acl)
                        
                ace = &result->acl[result->count];
                
-               ace->uid = 0;
-               ace->gid = 0;
-               DEBUG(10,("ace->uid = %d\n",ace->uid));
+               ace->info.user.uid = 0;
+               ace->info.group.gid = 0;
+               DEBUG(10,("ace->info.user.uid = %d\n",ace->info.user.uid));
                
                switch(i) {
                case 2:
@@ -287,7 +287,7 @@ struct acl *aixacl_smb_to_aixacl(SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
                ace_id->id_type = (smb_entry->a_type==SMB_ACL_GROUP) ? ACEID_GROUP : ACEID_USER;
                DEBUG(10,("The id type is %d\n",ace_id->id_type));
                ace_id->id_len = sizeof(struct ace_id); /* contains 1 id_data */
-               ace_id->id_data[0] = (smb_entry->a_type==SMB_ACL_GROUP) ? smb_entry->gid : smb_entry->uid;
+               ace_id->id_data[0] = (smb_entry->a_type==SMB_ACL_GROUP) ? smb_entry->info.group.gid : smb_entry->info.user.uid;
        }
 
        return file_acl;