|
rpm-build |
0a0c83 |
/*
|
|
rpm-build |
0a0c83 |
Copyright (C) 2000, 2002, 2003 Andreas Gruenbacher <agruen@suse.de>
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
This program is free software: you can redistribute it and/or modify it
|
|
rpm-build |
0a0c83 |
under the terms of the GNU Lesser General Public License as published by
|
|
rpm-build |
0a0c83 |
the Free Software Foundation, either version 2.1 of the License, or
|
|
rpm-build |
0a0c83 |
(at your option) any later version.
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
This program is distributed in the hope that it will be useful,
|
|
rpm-build |
0a0c83 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
rpm-build |
0a0c83 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
rpm-build |
0a0c83 |
GNU Lesser General Public License for more details.
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
You should have received a copy of the GNU Lesser General Public License
|
|
rpm-build |
0a0c83 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
rpm-build |
0a0c83 |
*/
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#include "config.h"
|
|
rpm-build |
0a0c83 |
#include <errno.h>
|
|
rpm-build |
0a0c83 |
#include <sys/acl.h>
|
|
rpm-build |
0a0c83 |
#include <acl/libacl.h>
|
|
rpm-build |
0a0c83 |
#include <errno.h>
|
|
rpm-build |
0a0c83 |
#include "libobj.h"
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#ifndef ENOATTR
|
|
rpm-build |
0a0c83 |
# define ENOATTR ENODATA
|
|
rpm-build |
0a0c83 |
#endif
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
typedef unsigned int permset_t;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define ACL_PERM_NONE (0x0000)
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* object types */
|
|
rpm-build |
0a0c83 |
struct acl_permset_obj_tag;
|
|
rpm-build |
0a0c83 |
typedef struct acl_permset_obj_tag acl_permset_obj;
|
|
rpm-build |
0a0c83 |
struct qualifier_obj_tag;
|
|
rpm-build |
0a0c83 |
typedef struct qualifier_obj_tag qualifier_obj;
|
|
rpm-build |
0a0c83 |
struct acl_entry_obj_tag;
|
|
rpm-build |
0a0c83 |
typedef struct acl_entry_obj_tag acl_entry_obj;
|
|
rpm-build |
0a0c83 |
struct acl_obj_tag;
|
|
rpm-build |
0a0c83 |
typedef struct acl_obj_tag acl_obj;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* permset_t object */
|
|
rpm-build |
0a0c83 |
struct __acl_permset_ext {
|
|
rpm-build |
0a0c83 |
permset_t s_perm;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
struct acl_permset_obj_tag {
|
|
rpm-build |
0a0c83 |
obj_prefix o_prefix;
|
|
rpm-build |
0a0c83 |
struct __acl_permset_ext i;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define sperm i.s_perm
|
|
rpm-build |
0a0c83 |
#define oprefix i.o_prefix
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define permset_obj_equal(s1, s2) \
|
|
rpm-build |
0a0c83 |
((s1).sperm == (s2).sperm)
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* qualifier object */
|
|
rpm-build |
0a0c83 |
struct __qualifier_ext {
|
|
rpm-build |
0a0c83 |
id_t q_id;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
struct qualifier_obj_tag {
|
|
rpm-build |
0a0c83 |
obj_prefix o_prefix;
|
|
rpm-build |
0a0c83 |
struct __qualifier_ext i;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define qid i.q_id
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define qualifier_obj_id(q) \
|
|
rpm-build |
0a0c83 |
((q).qid)
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* acl_entry object */
|
|
rpm-build |
0a0c83 |
struct __acl_entry {
|
|
rpm-build |
0a0c83 |
acl_tag_t e_tag;
|
|
rpm-build |
0a0c83 |
qualifier_obj e_id;
|
|
rpm-build |
0a0c83 |
acl_permset_obj e_perm;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
struct __acl_entry_ext {
|
|
rpm-build |
0a0c83 |
acl_entry_obj *e_prev, *e_next;
|
|
rpm-build |
0a0c83 |
acl_obj *e_container;
|
|
rpm-build |
0a0c83 |
struct __acl_entry e_entry;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
struct acl_entry_obj_tag {
|
|
rpm-build |
0a0c83 |
obj_prefix o_prefix;
|
|
rpm-build |
0a0c83 |
struct __acl_entry_ext i;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define econtainer i.e_container
|
|
rpm-build |
0a0c83 |
#define eprev i.e_prev
|
|
rpm-build |
0a0c83 |
#define enext i.e_next
|
|
rpm-build |
0a0c83 |
#define eentry i.e_entry
|
|
rpm-build |
0a0c83 |
#define etag i.e_entry.e_tag
|
|
rpm-build |
0a0c83 |
#define eperm i.e_entry.e_perm
|
|
rpm-build |
0a0c83 |
#define eid i.e_entry.e_id
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define init_acl_entry_obj(entry) do { \
|
|
rpm-build |
0a0c83 |
(entry).etag = ACL_UNDEFINED_TAG; \
|
|
rpm-build |
0a0c83 |
new_obj_p_here(acl_permset, &(entry).eperm); \
|
|
rpm-build |
0a0c83 |
(entry).eperm.sperm = ACL_PERM_NONE; \
|
|
rpm-build |
0a0c83 |
new_obj_p_here(qualifier, &(entry).eid); \
|
|
rpm-build |
0a0c83 |
(entry).eid.qid = ACL_UNDEFINED_ID; \
|
|
rpm-build |
0a0c83 |
} while(0)
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* acl object */
|
|
rpm-build |
0a0c83 |
struct __acl_ext {
|
|
rpm-build |
0a0c83 |
acl_entry_obj *a_prev, *a_next;
|
|
rpm-build |
0a0c83 |
acl_entry_obj *a_curr;
|
|
rpm-build |
0a0c83 |
acl_entry_obj *a_prealloc, *a_prealloc_end;
|
|
rpm-build |
0a0c83 |
size_t a_used;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
struct acl_obj_tag {
|
|
rpm-build |
0a0c83 |
obj_prefix o_prefix;
|
|
rpm-build |
0a0c83 |
struct __acl_ext i;
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define aprev i.a_prev
|
|
rpm-build |
0a0c83 |
#define anext i.a_next
|
|
rpm-build |
0a0c83 |
#define acurr i.a_curr
|
|
rpm-build |
0a0c83 |
#define aused i.a_used
|
|
rpm-build |
0a0c83 |
#define aprealloc i.a_prealloc
|
|
rpm-build |
0a0c83 |
#define aprealloc_end i.a_prealloc_end
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
/* external ACL representation */
|
|
rpm-build |
0a0c83 |
struct __acl {
|
|
rpm-build |
0a0c83 |
size_t x_size;
|
|
rpm-build |
0a0c83 |
struct __acl_entry x_entries[0];
|
|
rpm-build |
0a0c83 |
};
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
extern int __acl_reorder_entry_obj_p(acl_entry_obj *acl_entry_obj_p) hidden;
|
|
rpm-build |
0a0c83 |
extern int __acl_reorder_obj_p(acl_obj *acl_obj_p) hidden;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
extern acl_obj *__acl_init_obj(int count) hidden;
|
|
rpm-build |
0a0c83 |
extern acl_entry_obj *__acl_create_entry_obj(acl_obj *acl_obj_p) hidden;
|
|
rpm-build |
0a0c83 |
extern void __acl_free_acl_obj(acl_obj *acl_obj_p) hidden;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
extern char *__acl_to_any_text(acl_t acl, ssize_t *len_p,
|
|
rpm-build |
0a0c83 |
const char *prefix, char separator,
|
|
rpm-build |
0a0c83 |
const char *suffix, int options) hidden;
|
|
rpm-build |
0a0c83 |
extern int __apply_mask_to_mode(mode_t *mode, acl_t acl) hidden;
|
|
rpm-build |
0a0c83 |
|
|
rpm-build |
0a0c83 |
#define FOREACH_ACL_ENTRY(entry_obj_p, acl_obj_p) \
|
|
rpm-build |
0a0c83 |
for( (entry_obj_p) = (acl_obj_p)->anext; \
|
|
rpm-build |
0a0c83 |
(entry_obj_p) != (acl_entry_obj *)(acl_obj_p); \
|
|
rpm-build |
0a0c83 |
(entry_obj_p) = (entry_obj_p)->enext )
|