예제 #1
0
파일: acl_dup.c 프로젝트: aaronknister/acl
/* 23.4.11 */
acl_t
acl_dup(acl_t acl)
{
	acl_entry_obj *entry_obj_p, *dup_entry_obj_p;
	acl_obj *acl_obj_p = ext2int(acl, acl);
	acl_obj *dup_obj_p;

	if (!acl_obj_p)
		return NULL;
	dup_obj_p = __acl_init_obj(acl_obj_p->aused);
	if (!dup_obj_p)
		return NULL;

	FOREACH_ACL_ENTRY(entry_obj_p, acl_obj_p) {
		dup_entry_obj_p = __acl_create_entry_obj(dup_obj_p);
		if (dup_entry_obj_p == NULL)
			goto fail;

		dup_entry_obj_p->etag  = entry_obj_p->etag;
		dup_entry_obj_p->eid   = entry_obj_p->eid;
		dup_entry_obj_p->eperm = entry_obj_p->eperm;
	}
예제 #2
0
/* 23.4.6 */
acl_t
acl_copy_int(const void *buf_p)
{
	const struct __acl *ext_acl = (struct __acl *)buf_p;
	const struct __acl_entry *ent_p = ext_acl->x_entries, *end_p;
	size_t size = ext_acl ? ext_acl->x_size : 0;
	int entries;
	acl_obj *acl_obj_p;
	acl_entry_obj *entry_obj_p;

	if (!ext_acl || size < sizeof(struct __acl)) {
		errno = EINVAL;
		return NULL;
	}
	size -= sizeof(struct __acl);
	if (size % sizeof(struct __acl_entry)) {
		errno = EINVAL;
		return NULL;
	}
	entries = size / sizeof(struct __acl_entry);
	acl_obj_p = __acl_init_obj(entries);
	if (acl_obj_p == NULL)
		goto fail;
	end_p = ext_acl->x_entries + entries;
	for(; ent_p != end_p; ent_p++) {
		entry_obj_p = __acl_create_entry_obj(acl_obj_p);
		if (!entry_obj_p)
			goto fail;
		/* XXX Convert to machine endianness */
		entry_obj_p->eentry = *ent_p;
	}
	if (__acl_reorder_obj_p(acl_obj_p))
		goto fail;
	return int2ext(acl_obj_p);

fail:
	__acl_free_acl_obj(acl_obj_p);
	return NULL;
}