1#include <errno.h>
2#include <sys/acl.h>
3#include "libobj.h"
4
5typedef unsigned int permset_t;
6
7#define ACL_PERM_NONE		(0x0000)
8
9/* object types */
10struct acl_permset_obj_tag;
11typedef struct acl_permset_obj_tag acl_permset_obj;
12struct qualifier_obj_tag;
13typedef struct qualifier_obj_tag qualifier_obj;
14struct acl_entry_obj_tag;
15typedef struct acl_entry_obj_tag acl_entry_obj;
16struct acl_obj_tag;
17typedef struct acl_obj_tag acl_obj;
18
19/* permset_t object */
20struct __acl_permset_ext {
21	permset_t		s_perm;
22};
23struct acl_permset_obj_tag {
24	obj_prefix		o_prefix;
25	struct __acl_permset_ext i;
26};
27
28#define sperm i.s_perm
29#define oprefix i.o_prefix
30
31#define permset_obj_equal(s1, s2) \
32	((s1).sperm == (s2).sperm)
33
34/* qualifier object */
35struct __qualifier_ext {
36        id_t                    q_id;
37};
38
39struct qualifier_obj_tag {
40	obj_prefix		o_prefix;
41	struct __qualifier_ext	i;
42};
43
44#define qid i.q_id
45
46#define qualifier_obj_id(q) \
47	((q).qid)
48
49/* acl_entry object */
50struct __acl_entry {
51	acl_tag_t		e_tag;
52	qualifier_obj		e_id;
53	acl_permset_obj		e_perm;
54};
55
56struct __acl_entry_ext {
57	acl_entry_obj		*e_prev, *e_next;
58	acl_obj			*e_container;
59	struct __acl_entry	e_entry;
60};
61
62struct acl_entry_obj_tag {
63	obj_prefix              o_prefix;
64	struct __acl_entry_ext	i;
65};
66
67#define econtainer i.e_container
68#define eprev i.e_prev
69#define enext i.e_next
70#define eentry i.e_entry
71#define etag i.e_entry.e_tag
72#define eperm i.e_entry.e_perm
73#define eid   i.e_entry.e_id
74
75#define init_acl_entry_obj(entry) do { \
76	(entry).etag = ACL_UNDEFINED_TAG; \
77	new_obj_p_here(acl_permset, &(entry).eperm); \
78	(entry).eperm.sperm = ACL_PERM_NONE; \
79	new_obj_p_here(qualifier, &(entry).eid); \
80	(entry).eid.qid = ACL_UNDEFINED_ID; \
81	} while(0)
82
83/* acl object */
84struct __acl_ext {
85	acl_entry_obj		*a_prev, *a_next;
86	acl_entry_obj		*a_curr;
87	acl_entry_obj		*a_prealloc, *a_prealloc_end;
88	size_t			a_used;
89};
90struct acl_obj_tag {
91	obj_prefix              o_prefix;
92	struct __acl_ext	i;
93};
94
95#define aprev		i.a_prev
96#define anext		i.a_next
97#define acurr		i.a_curr
98#define aused		i.a_used
99#define aprealloc	i.a_prealloc
100#define aprealloc_end	i.a_prealloc_end
101
102/* external ACL representation */
103struct __acl {
104	size_t			x_size;
105	struct __acl_entry	x_entries[0];
106};
107
108extern int __acl_reorder_entry_obj_p(acl_entry_obj *acl_entry_obj_p) hidden;
109extern int __acl_reorder_obj_p(acl_obj *acl_obj_p) hidden;
110
111extern acl_obj *__acl_init_obj(int count) hidden;
112extern acl_entry_obj *__acl_create_entry_obj(acl_obj *acl_obj_p) hidden;
113extern void __acl_free_acl_obj(acl_obj *acl_obj_p) hidden;
114
115extern char *__acl_to_any_text(acl_t acl, ssize_t *len_p,
116			       const char *prefix, char separator,
117			       const char *suffix, int options) hidden;
118extern int __apply_mask_to_mode(mode_t *mode, acl_t acl) hidden;
119
120#define FOREACH_ACL_ENTRY(entry_obj_p, acl_obj_p) \
121	for( (entry_obj_p) = (acl_obj_p)->anext; \
122	     (entry_obj_p) != (acl_entry_obj *)(acl_obj_p); \
123	     (entry_obj_p) = (entry_obj_p)->enext )
124