[BACK]Return to nfs4acl.h CVS log [TXT][DIR] Up to [Development] / xfs-cmds / nfs4acl / include

File: [Development] / xfs-cmds / nfs4acl / include / nfs4acl.h (download)

Revision 1.4, Thu Jul 24 15:55:26 2008 UTC (9 years, 3 months ago) by tes.longdrop.melbourne.sgi.com
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +23 -13 lines

* Rename nfs4ace_is_same_who to nfs4ace_is_same_identifier, and export it to
   library users.
 * Add nfs4ace_copy.
 * Finally implement the --modify and --modify-file switches.
 * Add missing parentheses in nfs4acl_for_each_entry and nfs4acl_for_each_entry_reverse.
 * Add a flags parameter to nfs4acl_from_text in which nfs4acl_from_text retrns which
   parts of the acl have been set (mask(s) and/or flags). We use this for telling
   which parts to override in a --modify operation. Adapt src/nfs4acl.c accordingly.
 * nfs4acl_to_text Only hide permissions which are never allowed anyway from the masks,
   but not from ACEs, particularly not from DENY ACEs.
Merge of master-melb:xfs-cmds:31744a by kenmcd.

#ifndef __NFS4ACL_H
#define __NFS4ACL_H

#include <sys/types.h>
#include <string.h>

/* a_flags values */
#define ACL4_AUTO_INHERIT		0x01
#define ACL4_PROTECTED			0x02
#define ACL4_DEFAULTED			0x04
#define ACL4_WRITE_THROUGH		0x40

#define ACL4_VALID_FLAGS ( \
	ACL4_AUTO_INHERIT | \
	ACL4_PROTECTED | \
	ACL4_DEFAULTED | \
	ACL4_WRITE_THROUGH )

/* e_type values */
#define ACE4_ACCESS_ALLOWED_ACE_TYPE    0x0000
#define ACE4_ACCESS_DENIED_ACE_TYPE     0x0001

/* e_flags bitflags */
#define ACE4_FILE_INHERIT_ACE		0x0001
#define ACE4_DIRECTORY_INHERIT_ACE	0x0002
#define ACE4_NO_PROPAGATE_INHERIT_ACE	0x0004
#define ACE4_INHERIT_ONLY_ACE		0x0008
#define ACE4_IDENTIFIER_GROUP		0x0040
#define ACE4_INHERITED_ACE		0x0080

#define ACE4_VALID_FLAGS ( \
	ACE4_FILE_INHERIT_ACE | \
	ACE4_DIRECTORY_INHERIT_ACE | \
	ACE4_NO_PROPAGATE_INHERIT_ACE | \
	ACE4_INHERIT_ONLY_ACE | \
	ACE4_IDENTIFIER_GROUP | \
	ACE4_INHERITED_ACE )

/* e_mask bitflags */
#define ACE4_READ_DATA			0x00000001
#define ACE4_LIST_DIRECTORY		0x00000001
#define ACE4_WRITE_DATA			0x00000002
#define ACE4_ADD_FILE			0x00000002
#define ACE4_APPEND_DATA		0x00000004
#define ACE4_ADD_SUBDIRECTORY		0x00000004
#define ACE4_READ_NAMED_ATTRS		0x00000008
#define ACE4_WRITE_NAMED_ATTRS		0x00000010
#define ACE4_EXECUTE			0x00000020
#define ACE4_DELETE_CHILD		0x00000040
#define ACE4_READ_ATTRIBUTES		0x00000080
#define ACE4_WRITE_ATTRIBUTES		0x00000100
#define ACE4_DELETE			0x00010000
#define ACE4_READ_ACL			0x00020000
#define ACE4_WRITE_ACL			0x00040000
#define ACE4_WRITE_OWNER		0x00080000
#define ACE4_SYNCHRONIZE		0x00100000

#define ACE4_VALID_MASK ( \
	ACE4_READ_DATA | ACE4_LIST_DIRECTORY | \
	ACE4_WRITE_DATA | ACE4_ADD_FILE | \
	ACE4_APPEND_DATA | ACE4_ADD_SUBDIRECTORY | \
	ACE4_READ_NAMED_ATTRS | \
	ACE4_WRITE_NAMED_ATTRS | \
	ACE4_EXECUTE | \
	ACE4_DELETE_CHILD | \
	ACE4_READ_ATTRIBUTES | \
	ACE4_WRITE_ATTRIBUTES | \
	ACE4_DELETE | \
	ACE4_READ_ACL | \
	ACE4_WRITE_ACL | \
	ACE4_WRITE_OWNER | \
	ACE4_SYNCHRONIZE )

struct nfs4ace {
	unsigned short	e_type;
	unsigned short	e_flags;
	unsigned int	e_mask;
	union {
		id_t		e_id;
		const char	*e_who;
	} u;
};

struct nfs4acl {
	unsigned char	a_flags;
	unsigned short	a_count;
	unsigned int	a_owner_mask;
	unsigned int	a_group_mask;
	unsigned int	a_other_mask;
	struct nfs4ace  a_entries[0];
};

#define nfs4acl_for_each_entry(_ace, _acl) \
	for ((_ace) = (_acl)->a_entries; \
	     (_ace) != (_acl)->a_entries + (_acl)->a_count; \
	     (_ace)++)

#define nfs4acl_for_each_entry_reverse(_ace, _acl) \
	for ((_ace) = (_acl)->a_entries + (_acl)->a_count - 1; \
	     (_ace) != (_acl)->a_entries - 1; \
	     (_ace)--)

/* nfs4acl_to_text flags */
#define NFS4ACL_TEXT_LONG		1
#define NFS4ACL_TEXT_FILE_CONTEXT	2
#define NFS4ACL_TEXT_DIRECTORY_CONTEXT	4
#define NFS4ACL_TEXT_SHOW_MASKS		8
#define NFS4ACL_TEXT_SIMPLIFY		16

/* nfs4acl_from_text flags */
#define NFS4ACL_TEXT_OWNER_MASK		1
#define NFS4ACL_TEXT_GROUP_MASK		2
#define NFS4ACL_TEXT_OTHER_MASK		4
#define NFS4ACL_TEXT_FLAGS		8

extern int nfs4ace_is_owner(const struct nfs4ace *);
extern int nfs4ace_is_group(const struct nfs4ace *);
extern int nfs4ace_is_everyone(const struct nfs4ace *);

static inline int nfs4ace_is_allow(const struct nfs4ace *ace)
{
	return ace->e_type == ACE4_ACCESS_ALLOWED_ACE_TYPE;
}

static inline int nfs4ace_is_deny(const struct nfs4ace *ace)
{
	return ace->e_type == ACE4_ACCESS_DENIED_ACE_TYPE;
}

extern const char *nfs4ace_get_who(const struct nfs4ace *);

extern int nfs4ace_set_who(struct nfs4ace *, const char *);
extern void nfs4ace_set_uid(struct nfs4ace *, uid_t);
extern void nfs4ace_set_gid(struct nfs4ace *, gid_t);
extern int nfs4ace_is_same_identifier(const struct nfs4ace *, const struct nfs4ace *);
extern void nfs4ace_copy(struct nfs4ace *, const struct nfs4ace *);

extern struct nfs4acl *nfs4acl_get_file(const char *);
extern struct nfs4acl *nfs4acl_get_fd(int);
extern int nfs4acl_set_file(const char *, const struct nfs4acl *);
extern int nfs4acl_set_fd(int, const struct nfs4acl *);

extern char *nfs4acl_to_text(const struct nfs4acl *, int);
extern struct nfs4acl *nfs4acl_from_text(const char *, int *,
					 void (*)(const char *, ...));

extern struct nfs4acl *nfs4acl_alloc(size_t);
extern struct nfs4acl *nfs4acl_clone(struct nfs4acl *);
extern void nfs4acl_free(struct nfs4acl *);

extern int nfs4acl_apply_masks(struct nfs4acl **);
extern void nfs4acl_compute_max_masks(struct nfs4acl *);
extern struct nfs4acl *nfs4acl_from_mode(mode_t);

#endif  /* __NFS4ACL_H */