diff options
Diffstat (limited to 'sys/ufs')
-rw-r--r-- | sys/ufs/ufs/extattr.h | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/sys/ufs/ufs/extattr.h b/sys/ufs/ufs/extattr.h index cf32227..c1ceee5 100644 --- a/sys/ufs/ufs/extattr.h +++ b/sys/ufs/ufs/extattr.h @@ -69,6 +69,48 @@ struct ufs_extattr_header { /* data follows the header */ }; +/* + * This structure defines the required fields of an extended-attribute header. + */ +struct extattr { + int32_t ea_length; /* length of this attribute */ + int8_t ea_namespace; /* name space of this attribute */ + int8_t ea_contentpadlen; /* bytes of padding at end of attribute */ + int8_t ea_namelength; /* length of attribute name */ + char ea_name[1]; /* null-terminated attribute name */ + /* extended attribute content follows */ +}; + +/* + * These macros are used to access and manipulate an extended attribute: + * + * EXTATTR_NEXT(eap) returns a pointer to the next extended attribute + * following eap. + * EXTATTR_CONTENT(eap) returns a pointer to the extended attribute + * content referenced by eap. + * EXTATTR_CONTENT_SIZE(eap) returns the size of the extended attribute + * content referenced by eap. + * EXTATTR_SET_LENGTHS(eap, contentsize) called after initializing the + * attribute name to calculate and set the ea_length, ea_namelength, + * and ea_contentpadlen fields of the extended attribute structure. + */ +#define EXTATTR_NEXT(eap) \ + ((struct extattr *)(((void *)(eap)) + (eap)->ea_length)) +#define EXTATTR_CONTENT(eap) (((void *)(eap)) + EXTATTR_BASE_LENGTH(eap)) +#define EXTATTR_CONTENT_SIZE(eap) \ + ((eap)->ea_length - EXTATTR_BASE_LENGTH(eap) - (eap)->ea_contentpadlen) +#define EXTATTR_BASE_LENGTH(eap) \ + ((sizeof(struct extattr) + (eap)->ea_namelength + 7) & ~7) +#define EXTATTR_SET_LENGTHS(eap, contentsize) do { \ + KASSERT(((eap)->ea_name[0] != 0), \ + ("Must initialize name before setting lengths")); \ + (eap)->ea_namelength = strlen((eap)->ea_name); \ + (eap)->ea_contentpadlen = ((contentsize) % 8) ? \ + 8 - ((contentsize) % 8) : 0; \ + (eap)->ea_length = EXTATTR_BASE_LENGTH(eap) + \ + (contentsize) + (eap)->ea_contentpadlen; \ +} while (0) + #ifdef _KERNEL #ifdef MALLOC_DECLARE @@ -106,6 +148,13 @@ int ufs_deleteextattr(struct vop_deleteextattr_args *ap); int ufs_setextattr(struct vop_setextattr_args *ap); void ufs_extattr_vnode_inactive(struct vnode *vp, struct thread *td); +#else + +/* User-level definition of KASSERT for macros above */ +#define KASSERT(cond, str) do { \ + if (!(cond)) { printf("panic: "); printf(str); printf("\n"); exit(1); }\ +} while (0) + #endif /* !_KERNEL */ #endif /* !_UFS_UFS_EXTATTR_H_ */ |