summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2007-03-06 08:13:21 +0000
committermckusick <mckusick@FreeBSD.org>2007-03-06 08:13:21 +0000
commite5953785d06c108599cb30d8a2cfe0c8b6419ef0 (patch)
tree7cb99a7cb1fbd1e92be219f0b948c30b7689d734 /sys/ufs
parentfe063bb84d1657ff868f2c2ec73a39f9b18590f0 (diff)
downloadFreeBSD-src-e5953785d06c108599cb30d8a2cfe0c8b6419ef0.zip
FreeBSD-src-e5953785d06c108599cb30d8a2cfe0c8b6419ef0.tar.gz
Move macros describing extended attributes in UFS from
<sys/extattr.h> to <ufs/ufs/extattr.h>. Move description of extended attributes in UFS from man9/extattr.9 to man5/fs.5. Note that restore will not compile until <sys/extattr.h> and <ufs/ufs/extattr.h> have been updated. Suggested by: Robert Watson
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ufs/extattr.h49
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_ */
OpenPOWER on IntegriCloud