set correct doc dir
[platform/upstream/acl.git] / libacl / libacl.h
1 /*
2   Copyright (C) 2000, 2002, 2003  Andreas Gruenbacher <agruen@suse.de>
3
4   This program is free software: you can redistribute it and/or modify it
5   under the terms of the GNU Lesser General Public License as published by
6   the Free Software Foundation, either version 2.1 of the License, or
7   (at your option) any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public License
15   along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include <errno.h>
19 #include <sys/acl.h>
20 #include "libobj.h"
21
22 typedef unsigned int permset_t;
23
24 #define ACL_PERM_NONE           (0x0000)
25
26 /* object types */
27 struct acl_permset_obj_tag;
28 typedef struct acl_permset_obj_tag acl_permset_obj;
29 struct qualifier_obj_tag;
30 typedef struct qualifier_obj_tag qualifier_obj;
31 struct acl_entry_obj_tag;
32 typedef struct acl_entry_obj_tag acl_entry_obj;
33 struct acl_obj_tag;
34 typedef struct acl_obj_tag acl_obj;
35
36 /* permset_t object */
37 struct __acl_permset_ext {
38         permset_t               s_perm;
39 };
40 struct acl_permset_obj_tag {
41         obj_prefix              o_prefix;
42         struct __acl_permset_ext i;
43 };
44
45 #define sperm i.s_perm
46 #define oprefix i.o_prefix
47
48 #define permset_obj_equal(s1, s2) \
49         ((s1).sperm == (s2).sperm)
50
51 /* qualifier object */
52 struct __qualifier_ext {
53         id_t                    q_id;
54 };
55
56 struct qualifier_obj_tag {
57         obj_prefix              o_prefix;
58         struct __qualifier_ext  i;
59 };
60
61 #define qid i.q_id
62
63 #define qualifier_obj_id(q) \
64         ((q).qid)
65
66 /* acl_entry object */
67 struct __acl_entry {
68         acl_tag_t               e_tag;
69         qualifier_obj           e_id;
70         acl_permset_obj         e_perm;
71 };
72
73 struct __acl_entry_ext {
74         acl_entry_obj           *e_prev, *e_next;
75         acl_obj                 *e_container;
76         struct __acl_entry      e_entry;
77 };
78
79 struct acl_entry_obj_tag {
80         obj_prefix              o_prefix;
81         struct __acl_entry_ext  i;
82 };
83         
84 #define econtainer i.e_container
85 #define eprev i.e_prev
86 #define enext i.e_next
87 #define eentry i.e_entry
88 #define etag i.e_entry.e_tag
89 #define eperm i.e_entry.e_perm
90 #define eid   i.e_entry.e_id
91
92 #define init_acl_entry_obj(entry) do { \
93         (entry).etag = ACL_UNDEFINED_TAG; \
94         new_obj_p_here(acl_permset, &(entry).eperm); \
95         (entry).eperm.sperm = ACL_PERM_NONE; \
96         new_obj_p_here(qualifier, &(entry).eid); \
97         (entry).eid.qid = ACL_UNDEFINED_ID; \
98         } while(0)
99
100 /* acl object */
101 struct __acl_ext {
102         acl_entry_obj           *a_prev, *a_next;
103         acl_entry_obj           *a_curr;
104         acl_entry_obj           *a_prealloc, *a_prealloc_end;
105         size_t                  a_used;
106 };
107 struct acl_obj_tag {
108         obj_prefix              o_prefix;
109         struct __acl_ext        i;
110 };
111
112 #define aprev           i.a_prev
113 #define anext           i.a_next
114 #define acurr           i.a_curr
115 #define aused           i.a_used
116 #define aprealloc       i.a_prealloc
117 #define aprealloc_end   i.a_prealloc_end
118
119 /* external ACL representation */
120 struct __acl {
121         size_t                  x_size;
122         struct __acl_entry      x_entries[0];
123 };
124
125 extern int __acl_reorder_entry_obj_p(acl_entry_obj *acl_entry_obj_p) hidden;
126 extern int __acl_reorder_obj_p(acl_obj *acl_obj_p) hidden;
127
128 extern acl_obj *__acl_init_obj(int count) hidden;
129 extern acl_entry_obj *__acl_create_entry_obj(acl_obj *acl_obj_p) hidden;
130 extern void __acl_free_acl_obj(acl_obj *acl_obj_p) hidden;
131
132 extern char *__acl_to_any_text(acl_t acl, ssize_t *len_p,
133                                const char *prefix, char separator,
134                                const char *suffix, int options) hidden;
135 extern int __apply_mask_to_mode(mode_t *mode, acl_t acl) hidden;
136
137 #define FOREACH_ACL_ENTRY(entry_obj_p, acl_obj_p) \
138         for( (entry_obj_p) = (acl_obj_p)->anext; \
139              (entry_obj_p) != (acl_entry_obj *)(acl_obj_p); \
140              (entry_obj_p) = (entry_obj_p)->enext )