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