static struct smb_acl_t *smb_acl_to_internal(acl_t acl, TALLOC_CTX *mem_ctx) { struct smb_acl_t *result = sys_acl_init(mem_ctx); int entry_id = ACL_FIRST_ENTRY; acl_entry_t e; if (result == NULL) { return NULL; } while (acl_get_entry(acl, entry_id, &e) == 1) { entry_id = ACL_NEXT_ENTRY; 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")); errno = ENOMEM; return NULL; } if (!smb_ace_to_internal(e, &result->acl[result->count])) { TALLOC_FREE(result); return NULL; } result->count += 1; } return result; }
/* * convert either the access or the default part of a * soaris acl to the SMB_ACL format. */ static SMB_ACL_T solaris_acl_to_smb_acl(SOLARIS_ACL_T solaris_acl, int count, SMB_ACL_TYPE_T type) { SMB_ACL_T result; int i; if ((result = sys_acl_init(0)) == NULL) { DEBUG(10, ("error allocating memory for SMB_ACL\n")); goto fail; } for (i = 0; i < count; i++) { SMB_ACL_ENTRY_T smb_entry; SMB_ACL_PERM_T smb_perm; if (!_IS_OF_TYPE(solaris_acl[i], type)) { continue; } result = SMB_REALLOC(result, sizeof(struct smb_acl_t) + (sizeof(struct smb_acl_entry) * (result->count + 1))); if (result == NULL) { DEBUG(10, ("error reallocating memory for SMB_ACL\n")); goto fail; } smb_entry = &result->acl[result->count]; if (sys_acl_set_tag_type(smb_entry, solaris_tag_to_smb_tag(solaris_acl[i].a_type)) != 0) { DEBUG(10, ("invalid tag type given: 0x%04x\n", solaris_acl[i].a_type)); goto fail; } /* intentionally not checking return code here: */ sys_acl_set_qualifier(smb_entry, (void *)&solaris_acl[i].a_id); smb_perm = solaris_perm_to_smb_perm(solaris_acl[i].a_perm); if (sys_acl_set_permset(smb_entry, &smb_perm) != 0) { DEBUG(10, ("invalid permset given: %d\n", solaris_acl[i].a_perm)); goto fail; } result->count += 1; } goto done; fail: SAFE_FREE(result); done: DEBUG(10, ("solaris_acl_to_smb_acl %s\n", ((result == NULL) ? "failed" : "succeeded"))); return result; }
/* * convert either the access or the default part of a * soaris acl to the SMB_ACL format. */ static SMB_ACL_T hpux_acl_to_smb_acl(HPUX_ACL_T hpux_acl, int count, SMB_ACL_TYPE_T type, TALLOC_CTX *mem_ctx) { SMB_ACL_T result; int i; if ((result = sys_acl_init(mem_ctx)) == NULL) { DEBUG(10, ("error allocating memory for SMB_ACL\n")); goto fail; } for (i = 0; i < count; i++) { SMB_ACL_ENTRY_T smb_entry; SMB_ACL_PERM_T smb_perm; if (!_IS_OF_TYPE(hpux_acl[i], type)) { continue; } result->acl = talloc_realloc(result, result->acl, struct smb_acl_entry, result->count + 1); if (result->acl == NULL) { DEBUG(10, ("error reallocating memory for SMB_ACL\n")); goto fail; } smb_entry = &result->acl[result->count]; if (sys_acl_set_tag_type(smb_entry, hpux_tag_to_smb_tag(hpux_acl[i].a_type)) != 0) { DEBUG(10, ("invalid tag type given: 0x%04x\n", hpux_acl[i].a_type)); goto fail; } /* intentionally not checking return code here: */ sys_acl_set_qualifier(smb_entry, (void *)&hpux_acl[i].a_id); smb_perm = hpux_perm_to_smb_perm(hpux_acl[i].a_perm); if (sys_acl_set_permset(smb_entry, &smb_perm) != 0) { DEBUG(10, ("invalid permset given: %d\n", hpux_acl[i].a_perm)); goto fail; } result->count += 1; } goto done; fail: TALLOC_FREE(result); done: DEBUG(10, ("hpux_acl_to_smb_acl %s\n", ((result == NULL) ? "failed" : "succeeded"))); return result; }
SMB_ACL_T vfswrap_sys_acl_init(vfs_handle_struct *handle, connection_struct *conn, int count) { return sys_acl_init(count); }
static SMB_ACL_T vfswrap_sys_acl_init(vfs_handle_struct *handle, int count) { return sys_acl_init(count); }
static SMB_ACL_T gpfs2smb_acl(const struct gpfs_acl *pacl) { SMB_ACL_T result; int i; result = sys_acl_init(pacl->acl_nace); if (result == NULL) { errno = ENOMEM; return NULL; } result->count = pacl->acl_nace; for (i=0; i<pacl->acl_nace; i++) { struct smb_acl_entry *ace = &result->acl[i]; const struct gpfs_ace_v1 *g_ace = &pacl->ace_v1[i]; DEBUG(10, ("Converting type %d id %lu perm %x\n", (int)g_ace->ace_type, (unsigned long)g_ace->ace_who, (int)g_ace->ace_perm)); switch (g_ace->ace_type) { case GPFS_ACL_USER: ace->a_type = SMB_ACL_USER; ace->uid = (uid_t)g_ace->ace_who; break; case GPFS_ACL_USER_OBJ: ace->a_type = SMB_ACL_USER_OBJ; break; case GPFS_ACL_GROUP: ace->a_type = SMB_ACL_GROUP; ace->gid = (gid_t)g_ace->ace_who; break; case GPFS_ACL_GROUP_OBJ: ace->a_type = SMB_ACL_GROUP_OBJ; break; case GPFS_ACL_OTHER: ace->a_type = SMB_ACL_OTHER; break; case GPFS_ACL_MASK: ace->a_type = SMB_ACL_MASK; break; default: DEBUG(10, ("Got invalid ace_type: %d\n", g_ace->ace_type)); errno = EINVAL; SAFE_FREE(result); return NULL; } ace->a_perm = 0; ace->a_perm |= (g_ace->ace_perm & ACL_PERM_READ) ? SMB_ACL_READ : 0; ace->a_perm |= (g_ace->ace_perm & ACL_PERM_WRITE) ? SMB_ACL_WRITE : 0; ace->a_perm |= (g_ace->ace_perm & ACL_PERM_EXECUTE) ? SMB_ACL_EXECUTE : 0; DEBUGADD(10, ("Converted to %d perm %x\n", ace->a_type, ace->a_perm)); } return result; }