summaryrefslogtreecommitdiff
path: root/static/netbsd/man9/fileassoc.9
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man9/fileassoc.9')
-rw-r--r--static/netbsd/man9/fileassoc.9346
1 files changed, 346 insertions, 0 deletions
diff --git a/static/netbsd/man9/fileassoc.9 b/static/netbsd/man9/fileassoc.9
new file mode 100644
index 00000000..b9a88d45
--- /dev/null
+++ b/static/netbsd/man9/fileassoc.9
@@ -0,0 +1,346 @@
+.\" $NetBSD: fileassoc.9,v 1.30 2017/07/03 21:28:48 wiz Exp $
+.\"
+.\" Copyright (c) 2006 Elad Efrat <elad@NetBSD.org>
+.\" 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.
+.\" 3. The name of the author may not be used to endorse or promote products
+.\" derived from this software without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
+.\"
+.Dd December 1, 2016
+.Dt FILEASSOC 9
+.Os
+.Sh NAME
+.Nm fileassoc
+.Nd in-kernel, file system independent, file meta-data association
+.Sh SYNOPSIS
+.In sys/fileassoc.h
+.Ft int
+.Fn fileassoc_register "const char *name" \
+"fileassoc_cleanup_cb_t cleanup_cb" "fileassoc_t *result"
+.Ft int
+.Fn fileassoc_deregister "fileassoc_t id"
+.Ft void *
+.Fn fileassoc_lookup "struct vnode *vp" "fileassoc_t id"
+.Ft int
+.Fn fileassoc_table_delete "struct mount *mp"
+.Ft int
+.Fn fileassoc_table_clear "struct mount *mp" "fileassoc_t id"
+.Ft int
+.Fn fileassoc_table_run "struct mount *mp" "fileassoc_t id" \
+"fileassoc_cb_t cb" "void *cookie"
+.Ft int
+.Fn fileassoc_file_delete "struct vnode *vp"
+.Ft int
+.Fn fileassoc_add "struct vnode *vp" "fileassoc_t id" "void *data"
+.Ft int
+.Fn fileassoc_clear "struct vnode *vp" "fileassoc_t id"
+.Sh DESCRIPTION
+The
+.Nm
+KPI allows association of meta-data with files independent of file system
+support for such elaborate meta-data.
+.Pp
+When plugging a new fileassoc to the system, a developer can specify private
+data to be associated with every file, as well as (potentially different)
+private data to be associated with every file system mount.
+.Pp
+For example, a developer might choose to associate a custom ACL with every
+file, and a count of total files with ACLs with the mount.
+.Sh KERNEL PROGRAMMING INTERFACE
+Designed with simplicity in mind, the
+.Nm
+KPI usually accepts four different types of parameters to the most commonly
+used routines:
+.Bl -tag -width "123456"
+.It Ft struct mount * Ar mp
+Describing a mount on which to take action.
+.It Ft struct vnode * Ar vp
+Describing a file on which to take action.
+.It Ft fileassoc_t Ar id
+Describing an id, as returned from a successful call to
+.Fn fileassoc_register .
+.It Ft void * Ar data
+Describing a custom private data block, attached to either a file or a mount.
+.El
+.Pp
+Before using the
+.Nm
+KPI it is important to keep in mind that the interface provides memory
+management only for
+.Nm
+internal memory.
+Any additional memory stored in the tables (such as private data structures
+used by custom fileassocs) should be allocated and freed by the developer.
+.Pp
+.Nm
+provides the ability to specify a
+.Dq cleanup
+routine to
+.Fn fileassoc_register
+(see below)
+to be called whenever an entry for a file or a mount is deleted.
+.Ss REGISTRATION AND DEREGISTRATION ROUTINES
+These routines allow a developer to allocate a
+.Nm
+slot to be used for private data.
+.Bl -tag -width "123456"
+.It Fn fileassoc_register "name" "cleanup_cb" "result"
+Registers a new fileassoc as
+.Ar name ,
+and returns a
+.Ft fileassoc_t
+via
+.Fa result
+to be used as identifier in subsequent calls to the
+.Nm
+subsystem.
+.Pp
+.Fn fileassoc_register
+returns zero on success.
+Otherwise, an error number will be returned.
+.Pp
+If
+.Ar cleanup_cb
+is not
+.Dv NULL ,
+it will be called during delete/clear operations (see routines below) with
+indication whether the passed data is file- or mount-specific.
+.Pp
+.Ar cleanup_cb
+should be a function receiving a
+.Ft void *
+and returning
+.Ft void .
+See the
+.Sx EXAMPLES
+section for illustration.
+.Pp
+.It Fn fileassoc_deregister "id"
+Deregisters a
+.Nm fileassoc
+whose id is
+.Ar id .
+.Pp
+Note that calling
+.Fn fileassoc_deregister
+only frees the associated slot in the
+.Nm
+subsystem.
+It is up to the developer to take care of garbage collection.
+.El
+.Ss LOOKUP ROUTINES
+These routines allow lookup of
+.Nm
+mounts, files, and private data attached to them.
+.Bl -tag -width "123456"
+.It Fn fileassoc_lookup "vp" "id"
+Returns the private data for the file/id combination
+or
+.Dv NULL
+if not found.
+.El
+.Ss MOUNT-WIDE ROUTINES
+.Bl -tag -width "123456"
+.It Fn fileassoc_table_delete "mp"
+Deletes a fileassoc table for
+.Ar mp .
+.Pp
+.It Fn fileassoc_table_clear "mp" "id"
+Clear all table entries for
+.Ar fileassoc
+from
+.Ar mp .
+.Pp
+If specified, the fileassoc's
+.Dq cleanup routine
+will be called with a pointer to the private data structure.
+.Pp
+.It Fn fileassoc_table_run "mp" "id" "cb" "cookie"
+For each entry for
+.Ar id ,
+call
+.Ar cb
+with the entry being the first argument, and
+.Ar cookie
+being the second argument.
+.Pp
+.Ar cb
+is a function returning
+.Ft void
+and receiving two
+.Ft "void *"
+parameters.
+.El
+.Ss FILE-SPECIFIC ROUTINES
+.Bl -tag -width "123456"
+.It Fn fileassoc_file_delete "vp"
+Delete the fileassoc entries for
+.Ar vp .
+.Pp
+If specified, the
+.Dq cleanup routines
+of all fileassoc types added will be called with a pointer to the corresponding
+private data structure and indication of
+.Dv FILEASSOC_CLEANUP_FILE .
+.El
+.Ss FILEASSOC-SPECIFIC ROUTINES
+.Bl -tag -width "123456"
+.It Fn fileassoc_add "vp" "id" "data"
+Add private data in
+.Ar data
+for
+.Ar vp ,
+for the fileassoc specified by
+.Ar id .
+.Pp
+If a table for the mount-point
+.Ar vp
+is on doesn't exist, one will be created automatically.
+.Nm
+manages internally the optimal table sizes as tables are modified.
+.It Fn fileassoc_clear "vp" "id"
+Clear the private data for
+.Ar vp ,
+for the fileassoc specified by
+.Ar id .
+.Pp
+If specified, the fileassoc's
+.Dq cleanup routine
+will be called with a pointer to the private data structure and indication of
+.Dv FILEASSOC_CLEANUP_FILE .
+.El
+.Sh EXAMPLES
+The following code examples should give you a clue on using
+.Nm
+for your purposes.
+.Pp
+First, we'll begin with registering a new id.
+We need to do that to save a slot for private data storage with each mount
+and/or file:
+.Bd -literal -offset indent
+fileassoc_t myhook_id;
+int error;
+
+error = fileassoc_register("my_hook", myhook_cleanup, &myhook_id);
+if (error != 0)
+ ...handle error...
+.Ed
+.Pp
+In the above example we pass a
+.Fn myhook_cleanup
+routine.
+It could look something like this:
+.Bd -literal -offset indent
+void
+myhook_cleanup(void *data)
+{
+
+ printf("Myhook: Removing entry for file.\en");
+ ...handle file entry removal...
+ free(data, M_TEMP);
+}
+.Ed
+.Pp
+Another useful thing would be to add our private data to a file.
+For example, let's assume we keep a custom ACL with each file:
+.Bd -literal -offset indent
+int
+myhook_acl_add(struct vnode *vp, struct myhook_acl *acl)
+{
+ int error;
+
+ error = fileassoc_add(vp, myhook_id, acl);
+ if (error) {
+ printf("Myhook: Could not add ACL.\en");
+ ...handle error...
+ }
+
+ printf("Myhook: Added ACL.\en");
+
+ return (0);
+}
+.Ed
+.Pp
+Adding an entry will override any entry that previously exists.
+.Pp
+Whatever your plug is, eventually you'll want to access the private data you
+store with each file.
+To do that you can use the following:
+.Bd -literal -offset indent
+int
+myhook_acl_access(struct vnode *vp, int access_flags)
+{
+ struct myhook_acl *acl;
+
+ acl = fileassoc_lookup(vp, myhook_id);
+ if (acl == NULL)
+ return (0);
+
+ error = myhook_acl_eval(acl, access_flags);
+ if (error) {
+ printf("Myhook: Denying access based on ACL decision.\en");
+ return (error);
+ }
+
+ return (0);
+}
+.Ed
+.Pp
+And, in some cases, it may be desired to remove private data associated with
+an file:
+.Bd -literal -offset indent
+int error;
+
+error = fileassoc_clear(vp, myhook_id);
+if (error) {
+ printf("Myhook: Error occurred during fileassoc removal.\en");
+ ...handle error...
+}
+.Ed
+.Pp
+As mentioned previously, the call to
+.Fn fileassoc_clear
+will result in a call to the
+.Dq cleanup routine
+specified in the initial call to
+.Fn fileassoc_register .
+.Pp
+The above should be enough to get you started.
+.Pp
+For example usage of
+.Nm ,
+see the Veriexec code.
+.Sh CODE REFERENCES
+The
+.Nm
+is implemented within
+.Pa src/sys/kern/kern_fileassoc.c .
+.Sh SEE ALSO
+.Xr veriexec 9
+.Sh HISTORY
+The
+.Nm
+KPI first appeared in
+.Nx 4.0 .
+.Sh AUTHORS
+.An Elad Efrat Aq Mt elad@NetBSD.org
+.An Brett Lymn Aq Mt blymn@NetBSD.org