fdece2b8f7
attribute. Also define some macros to manipulate one of these structures. Explain their use in the extattr.9 manual page. The next step will be to make a sweep through the kernel replacing the old pointer manipulation code. To get an idea of how they would be used, the ffs_findextattr() function in ufs/ffs/ffs_vnops.c is currently written as follows: /* * Vnode operating to retrieve a named extended attribute. * * Locate a particular EA (nspace:name) in the area (ptr:length), and return * the length of the EA, and possibly the pointer to the entry and to the data. */ static int ffs_findextattr(u_char *ptr, u_int length, int nspace, const char *name, u_char **eap, u_char **eac) { u_char *p, *pe, *pn, *p0; int eapad1, eapad2, ealength, ealen, nlen; uint32_t ul; pe = ptr + length; nlen = strlen(name); for (p = ptr; p < pe; p = pn) { p0 = p; bcopy(p, &ul, sizeof(ul)); pn = p + ul; /* make sure this entry is complete */ if (pn > pe) break; p += sizeof(uint32_t); if (*p != nspace) continue; p++; eapad2 = *p++; if (*p != nlen) continue; p++; if (bcmp(p, name, nlen)) continue; ealength = sizeof(uint32_t) + 3 + nlen; eapad1 = 8 - (ealength % 8); if (eapad1 == 8) eapad1 = 0; ealength += eapad1; ealen = ul - ealength - eapad2; p += nlen + eapad1; if (eap != NULL) *eap = p0; if (eac != NULL) *eac = p; return (ealen); } return(-1); } After applying the structure and macros, it would look like this: /* * Vnode operating to retrieve a named extended attribute. * * Locate a particular EA (nspace:name) in the area (ptr:length), and return * the length of the EA, and possibly the pointer to the entry and to the data. */ static int ffs_findextattr(u_char *ptr, u_int length, int nspace, const char *name, u_char **eapp, u_char **eac) { struct extattr *eap, *eaend; eaend = (struct extattr *)(ptr + length); for (eap = (struct extattr *)ptr; eap < eaend; eap = EXTATTR_NEXT(eap)){ /* make sure this entry is complete */ if (EXTATTR_NEXT(eap) > eaend) break; if (eap->ea_namespace != nspace || eap->ea_namelength != length || bcmp(eap->ea_name, name, length)) continue; if (eapp != NULL) *eapp = eap; if (eac != NULL) *eac = EXTATTR_CONTENT(eap); return (EXTATTR_CONTENT_SIZE(eap)); } return(-1); } Not only is it considerably shorter, but it hopefully more readable :-)
152 lines
5.8 KiB
Groff
152 lines
5.8 KiB
Groff
.\"-
|
|
.\" Copyright (c) 1999, 2000, 2001, 2003 Robert N. M. Watson
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
.\" SUCH DAMAGE.
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.\"
|
|
.Dd December 23, 1999
|
|
.Os
|
|
.Dt EXTATTR 9
|
|
.Sh NAME
|
|
.Nm extattr
|
|
.Nd virtual file system named extended attributes
|
|
.Sh SYNOPSIS
|
|
.In sys/param.h
|
|
.In sys/vnode.h
|
|
.In sys/extattr.h
|
|
.Sh DESCRIPTION
|
|
Named extended attributes allow additional meta-data to be associated
|
|
with vnodes representing files and directories.
|
|
The semantics of this additional data is that of a "name=value" pair, where
|
|
a name may be defined or undefined, and if defined, associated with zero or
|
|
more bytes of arbitrary binary data.
|
|
Extended attribute names exist within a set of namespaces; each operation
|
|
on an extended attribute is required to provide the namespace to which to
|
|
operation refers.
|
|
If the same name is present in multiple namespaces, the extended attributes
|
|
associated with the names are stored and manipulated independently.
|
|
The following two namespaces are defined universally, although individual
|
|
file systems may implement additional namespaces, or not implement
|
|
these namespaces:
|
|
.Dv EXTATTR_NAMESPACE_USER ,
|
|
.Dv EXTATTR_NAMESPACE_SYSTEM .
|
|
The semantics of these attributes are intended to be as follows: user
|
|
attribute data is protected according the normal discretionary
|
|
and mandatory protections associated with the data in the file or
|
|
directory; system attribute data is protected such that appropriate
|
|
privilege is required to directly access or manipulate these attributes.
|
|
.Pp
|
|
Reads of extended attribute data may return specific contiguous regions of
|
|
the meta-data, in the style of
|
|
.Xr VOP_READ 9 ,
|
|
but writes will replace the entire current "value" associated with
|
|
a given name.
|
|
As there are a plethora of file systems with differing extended attributes,
|
|
availability and functionality of these functions may be limited, and they
|
|
should be used with awareness of the underlying semantics of the supporting
|
|
file system.
|
|
Authorization schemes for extended attribute data may also vary by file
|
|
system, as well as maximum attribute size, and whether or not any or
|
|
specific new attributes may be defined.
|
|
.Pp
|
|
Extended attributes are named using a null-terminated character string.
|
|
Depending on underlying file system semantics, this name may or may not be
|
|
case-sensitive.
|
|
Appropriate vnode extended attribute calls are:
|
|
.Xr VOP_GETEXTATTR 9 ,
|
|
.Xr VOP_LISTEXTATTR 9 ,
|
|
and
|
|
.Xr VOP_SETEXTATTR 9 .
|
|
.Pp
|
|
The format of an external attribute is defined by the extattr structure:
|
|
.Bd -literal
|
|
struct extattr {
|
|
int32_t ea_length; /* length of this attribute */
|
|
int8_t ea_namespace; /* name space of this attribute */
|
|
int8_t ea_contentpadlen; /* 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 */
|
|
};
|
|
.Ed
|
|
.Pp
|
|
Several macros are defined to manipulate these structures.
|
|
Each macro takes a pointer to an extattr structure.
|
|
.Bl -tag -width ".Dv EXTATTR_SET_LENGTHS(eap, size)"
|
|
.It Dv EXTATTR_NEXT(eap)
|
|
Returns a pointer to the next extended attribute following
|
|
.Fa eap .
|
|
.It Dv EXTATTR_CONTENT(eap)
|
|
Returns a pointer to the extended attribute content referenced by
|
|
.Fa eap .
|
|
.It Dv EXTATTR_CONTENT_SIZE(eap)
|
|
Returns the size of the extended attribute content referenced by
|
|
.Fa eap .
|
|
.It Dv EXTATTR_SET_LENGTHS(eap, size)
|
|
Called with the size of the attribute content after initializing
|
|
the attribute name to calculate and set the
|
|
.Fa ea_length ,
|
|
.Fa ea_namelength ,
|
|
and
|
|
.Fa ea_contentpadlen
|
|
fields of the extended attribute structure.
|
|
.El
|
|
.Pp
|
|
The following code identifies an ACL:
|
|
.Bd -literal
|
|
if (eap->ea_namespace == EXTATTR_NAMESPACE_SYSTEM &&
|
|
!strcmp(eap->ea_name, POSIX1E_ACL_ACCESS_EXTATTR_NAME) {
|
|
aclp = EXTATTR_CONTENT(eap);
|
|
acllen = EXTATTR_CONTENT_SIZE(eap);
|
|
...
|
|
}
|
|
.Ed
|
|
.Pp
|
|
The following code creates an extended attribute
|
|
containing a copy of a structure
|
|
.Fa mygif :
|
|
.Bd -literal
|
|
eap->ea_namespace = EXTATTR_NAMESPACE_USER;
|
|
strcpy(eap->ea_name, "filepic.gif");
|
|
EXTATTR_SET_LENGTHS(eap, sizeof(struct mygif));
|
|
memcpy(EXTATTR_CONTENT(eap), &mygif, sizeof(struct mygif));
|
|
.Ed
|
|
.Pp
|
|
.Sh SEE ALSO
|
|
.Xr VFS 9 ,
|
|
.Xr VFS_EXTATTRCTL 9 ,
|
|
.Xr VOP_GETEXTATTR 9 ,
|
|
.Xr VOP_LISTEXTATTR 9 ,
|
|
.Xr VOP_SETEXTATTR 9
|
|
.Sh AUTHORS
|
|
This manual page was written by
|
|
.An Robert Watson .
|
|
.Sh BUGS
|
|
In addition, the interface does not provide a mechanism to retrieve
|
|
the current set of available attributes; it has been suggested that
|
|
providing a
|
|
.Dv NULL
|
|
attribute name should cause a list of defined attributes for the passed file
|
|
or directory, but this is not currently implemented.
|