xref: /dflybsd-src/share/man/man9/make_autoclone_dev.9 (revision 4aff68f4d6082b57abced0bc92d9d3a4af28c34f)
12c8ac1b3SSascha Wildner.\"
22c8ac1b3SSascha Wildner.\" Copyright (c) 2009
32c8ac1b3SSascha Wildner.\"	The DragonFly Project.  All rights reserved.
42c8ac1b3SSascha Wildner.\"
52c8ac1b3SSascha Wildner.\" Redistribution and use in source and binary forms, with or without
62c8ac1b3SSascha Wildner.\" modification, are permitted provided that the following conditions
72c8ac1b3SSascha Wildner.\" are met:
82c8ac1b3SSascha Wildner.\"
92c8ac1b3SSascha Wildner.\" 1. Redistributions of source code must retain the above copyright
102c8ac1b3SSascha Wildner.\"    notice, this list of conditions and the following disclaimer.
112c8ac1b3SSascha Wildner.\" 2. Redistributions in binary form must reproduce the above copyright
122c8ac1b3SSascha Wildner.\"    notice, this list of conditions and the following disclaimer in
132c8ac1b3SSascha Wildner.\"    the documentation and/or other materials provided with the
142c8ac1b3SSascha Wildner.\"    distribution.
152c8ac1b3SSascha Wildner.\" 3. Neither the name of The DragonFly Project nor the names of its
162c8ac1b3SSascha Wildner.\"    contributors may be used to endorse or promote products derived
172c8ac1b3SSascha Wildner.\"    from this software without specific, prior written permission.
182c8ac1b3SSascha Wildner.\"
192c8ac1b3SSascha Wildner.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
202c8ac1b3SSascha Wildner.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
212c8ac1b3SSascha Wildner.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
222c8ac1b3SSascha Wildner.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
232c8ac1b3SSascha Wildner.\" COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
242c8ac1b3SSascha Wildner.\" INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
252c8ac1b3SSascha Wildner.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
262c8ac1b3SSascha Wildner.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
272c8ac1b3SSascha Wildner.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
282c8ac1b3SSascha Wildner.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
292c8ac1b3SSascha Wildner.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
302c8ac1b3SSascha Wildner.\" SUCH DAMAGE.
312c8ac1b3SSascha Wildner.\"
322c8ac1b3SSascha Wildner.Dd September 7, 2009
332c8ac1b3SSascha Wildner.Os
342c8ac1b3SSascha Wildner.Dt MAKE_AUTOCLONE_DEV 9
352c8ac1b3SSascha Wildner.Sh NAME
362c8ac1b3SSascha Wildner.Nm make_autoclone_dev ,
372c8ac1b3SSascha Wildner.Nm destroy_autoclone_dev ,
382c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_init ,
392c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_uninit ,
402c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_fff ,
412c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_chk ,
422c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_set ,
432c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_rst ,
442c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_get ,
452c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_put ,
462c8ac1b3SSascha Wildner.Nm DEVFS_DECLARE_CLONE_BITMAP ,
472c8ac1b3SSascha Wildner.Nm DEVFS_CLONE_BITMAP
482c8ac1b3SSascha Wildner.Nd device clone functions
492c8ac1b3SSascha Wildner.Sh SYNOPSIS
502c8ac1b3SSascha Wildner.In sys/types.h
512c8ac1b3SSascha Wildner.In sys/conf.h
522c8ac1b3SSascha Wildner.In sys/devfs.h
532c8ac1b3SSascha Wildner.Ft cdev_t
54*4aff68f4SSascha Wildner.Fn make_autoclone_dev "struct dev_ops *ops" "struct devfs_bitmap *bitmap" "d_clone_t *nhandler" "uid_t uid" "gid_t gid" "int perms" "const char *fmt" "..."
552c8ac1b3SSascha Wildner.Ft void
562c8ac1b3SSascha Wildner.Fn destroy_autoclone_dev "cdev_t dev" "struct devfs_bitmap *bitmap"
572c8ac1b3SSascha Wildner.Ft void
582c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init "struct devfs_bitmap *bitmap"
592c8ac1b3SSascha Wildner.Ft void
602c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit "struct devfs_bitmap *bitmap"
612c8ac1b3SSascha Wildner.Ft void
622c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff "struct devfs_bitmap *bitmap"
632c8ac1b3SSascha Wildner.Ft int
64*4aff68f4SSascha Wildner.Fn devfs_clone_bitmap_chk "struct devfs_bitmap *bitmap" "int unit"
652c8ac1b3SSascha Wildner.Ft void
66*4aff68f4SSascha Wildner.Fn devfs_clone_bitmap_set "struct devfs_bitmap *bitmap" "int unit"
672c8ac1b3SSascha Wildner.Ft void
68*4aff68f4SSascha Wildner.Fn devfs_clone_bitmap_rst "struct devfs_bitmap *bitmap" "int unit"
692c8ac1b3SSascha Wildner.Ft int
70*4aff68f4SSascha Wildner.Fn devfs_clone_bitmap_get "struct devfs_bitmap *bitmap" "int limit"
712c8ac1b3SSascha Wildner.Ft void
72*4aff68f4SSascha Wildner.Fn devfs_clone_bitmap_put "struct devfs_bitmap *bitmap" "int unit"
732c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP "name"
742c8ac1b3SSascha Wildner.Fn DEVFS_CLONE_BITMAP "name"
752c8ac1b3SSascha Wildner.Sh DESCRIPTION
762c8ac1b3SSascha Wildner.Fn make_autoclone_dev
772c8ac1b3SSascha Wildnercreates a
782c8ac1b3SSascha Wildner.Vt cdev_t
792c8ac1b3SSascha Wildnerwith the default
802c8ac1b3SSascha Wildner.Fa ops ,
812c8ac1b3SSascha Wildnervisible in the
822c8ac1b3SSascha Wildner.Xr devfs 5
832c8ac1b3SSascha Wildnernamespace, that (when opened) will invoke the clone handler specified by
842c8ac1b3SSascha Wildner.Fa nhandler .
852c8ac1b3SSascha WildnerIf a
862c8ac1b3SSascha Wildner.Vt devfs_bitmap *
872c8ac1b3SSascha Wildneris specified, the given
882c8ac1b3SSascha Wildner.Fa bitmap
892c8ac1b3SSascha Wildneris initialized using
902c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init .
912c8ac1b3SSascha Wildner.Pp
922c8ac1b3SSascha WildnerThe clone handler must be defined as follows:
932c8ac1b3SSascha Wildner.Bd -literal
942c8ac1b3SSascha Wildnerd_clone_t mydev_clone;
952c8ac1b3SSascha Wildner
962c8ac1b3SSascha Wildnerint
972c8ac1b3SSascha Wildnermydev_clone(struct dev_clone_args *ap)
982c8ac1b3SSascha Wildner{
992c8ac1b3SSascha Wildner};
1002c8ac1b3SSascha Wildner.Ed
1012c8ac1b3SSascha Wildner.Pp
1022c8ac1b3SSascha WildnerWhen called, the handler is passed a pointer to a populated
1032c8ac1b3SSascha Wildner.Vt dev_clone_args
1042c8ac1b3SSascha Wildnerstructure, which is defined as follows:
1052c8ac1b3SSascha Wildner.Bd -literal
1062c8ac1b3SSascha Wildnerstruct dev_clone_args {
1072c8ac1b3SSascha Wildner        struct dev_generic_args a_head;
1082c8ac1b3SSascha Wildner        struct cdev     *a_dev;
1092c8ac1b3SSascha Wildner        const char      *a_name;
1102c8ac1b3SSascha Wildner        size_t           a_namelen;
1112c8ac1b3SSascha Wildner        struct ucred    *a_cred;
1122c8ac1b3SSascha Wildner        int              a_mode;
1132c8ac1b3SSascha Wildner};
1142c8ac1b3SSascha Wildner.Ed
1152c8ac1b3SSascha Wildner.Pp
1162c8ac1b3SSascha Wildner.Fa a_head.a_dev
1172c8ac1b3SSascha Wildneris the
1182c8ac1b3SSascha Wildner.Vt cdev_t
1192c8ac1b3SSascha Wildnerof the accessed autoclone device.
1202c8ac1b3SSascha Wildner.Fa a_name
1212c8ac1b3SSascha Wildnerand
1222c8ac1b3SSascha Wildner.Fa a_namelen
1232c8ac1b3SSascha Wildnerare the registered clonable base name and its length, as specified to
1242c8ac1b3SSascha Wildner.Fn make_autoclone_dev .
1252c8ac1b3SSascha Wildner.Fa a_mode
1262c8ac1b3SSascha Wildnerand
1272c8ac1b3SSascha Wildner.Fa a_cred
1282c8ac1b3SSascha Wildnercontain the mode and cred passed to the autoclone device's
1292c8ac1b3SSascha Wildner.Fn open .
1302c8ac1b3SSascha Wildner.Pp
1312c8ac1b3SSascha WildnerThe clone handler must set
1322c8ac1b3SSascha Wildner.Fa a_dev
1332c8ac1b3SSascha Wildnerto a new
1342c8ac1b3SSascha Wildner.Vt cdev_t ,
1352c8ac1b3SSascha Wildnerreturned by a call to
1362c8ac1b3SSascha Wildner.Fn make_only_dev .
1372c8ac1b3SSascha Wildner.Fa a_dev
1382c8ac1b3SSascha Wildnermay also be set to
1392c8ac1b3SSascha Wildner.Dv NULL ,
1402c8ac1b3SSascha Wildnerin which case the
1412c8ac1b3SSascha Wildner.Fn open
1422c8ac1b3SSascha Wildnerwill ultimately fail with
1432c8ac1b3SSascha Wildner.Er ENXIO .
1442c8ac1b3SSascha WildnerIf
1452c8ac1b3SSascha Wildner.Fa a_dev
1462c8ac1b3SSascha Wildneris
1472c8ac1b3SSascha Wildner.Pf non- Ns Dv NULL ,
1482c8ac1b3SSascha Wildnerit is automatically made visible and linked into
1492c8ac1b3SSascha Wildner.Xr devfs 5
1502c8ac1b3SSascha Wildneras if it was created with
1512c8ac1b3SSascha Wildner.Fn make_dev .
1522c8ac1b3SSascha WildnerThus,
1532c8ac1b3SSascha Wildner.Fn destroy_dev
1542c8ac1b3SSascha Wildnershould be used to destroy the cloned
1552c8ac1b3SSascha Wildner.Vt cdev_t
1562c8ac1b3SSascha Wildneronce it is no longer required,
1572c8ac1b3SSascha Wildnerusually during
1582c8ac1b3SSascha Wildner.Fn close .
1592c8ac1b3SSascha Wildner.Pp
1602c8ac1b3SSascha Wildner.Fn destroy_autoclone_dev
1612c8ac1b3SSascha Wildnerdestroys a
1622c8ac1b3SSascha Wildner.Vt cdev_t
1632c8ac1b3SSascha Wildnercreated by
1642c8ac1b3SSascha Wildner.Fn make_autoclone_dev
1652c8ac1b3SSascha Wildnerunregistering its clone handler and (if non-NULL) also uninitializes its
1662c8ac1b3SSascha Wildner.Fa bitmap
1672c8ac1b3SSascha Wildnerusing
1682c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit .
1692c8ac1b3SSascha Wildner.Pp
1702c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init
1712c8ac1b3SSascha Wildnerinitializes the given clone
1722c8ac1b3SSascha Wildner.Fa bitmap
1732c8ac1b3SSascha Wildnerso it is ready to use.
1742c8ac1b3SSascha Wildner.Pp
1752c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit
1762c8ac1b3SSascha Wildnerfrees the memory associated with the specified clone
1772c8ac1b3SSascha Wildner.Fa bitmap
1782c8ac1b3SSascha Wildnerand leaves it unusable.
1792c8ac1b3SSascha Wildner.Pp
1802c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff
1812c8ac1b3SSascha Wildnerreturns the first unused unit in
1822c8ac1b3SSascha Wildner.Fa bitmap .
1832c8ac1b3SSascha WildnerTo use this unit, it has to be acquired by a call to
1842c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set .
1852c8ac1b3SSascha Wildner.Pp
1862c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_chk
1872c8ac1b3SSascha Wildnerchecks if
1882c8ac1b3SSascha Wildner.Fa unit
1892c8ac1b3SSascha Wildneris in use (set) and returns 1 if it is; otherwise 0 is returned.
1902c8ac1b3SSascha Wildner.Pp
1912c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set
1922c8ac1b3SSascha Wildnermarks
1932c8ac1b3SSascha Wildner.Fa unit
1942c8ac1b3SSascha Wildnerin
1952c8ac1b3SSascha Wildner.Fa bitmap
1962c8ac1b3SSascha Wildneras used, so further calls to
1972c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff
1982c8ac1b3SSascha Wildneror
1992c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get
2002c8ac1b3SSascha Wildnercannot retrieve it.
2012c8ac1b3SSascha WildnerIf one intends to use a clone handler along with preallocated devices, it
2022c8ac1b3SSascha Wildneris recommended to block the unit numbers of the preallocated devices by
2032c8ac1b3SSascha Wildnercalling
2042c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set
2052c8ac1b3SSascha Wildneron them.
2062c8ac1b3SSascha Wildner.Pp
2072c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_rst
2082c8ac1b3SSascha Wildnermarks
2092c8ac1b3SSascha Wildner.Fa unit
2102c8ac1b3SSascha Wildnerin the
2112c8ac1b3SSascha Wildner.Fa bitmap
2122c8ac1b3SSascha Wildneras unused so further calls to
2132c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff
2142c8ac1b3SSascha Wildneror
2152c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get
2162c8ac1b3SSascha Wildnercan retrieve it again.
2172c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_put
2182c8ac1b3SSascha Wildneris an alias for
2192c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_rst .
2202c8ac1b3SSascha Wildner.Pp
2212c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get
2222c8ac1b3SSascha Wildneris a shortcut to
2232c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff
2242c8ac1b3SSascha Wildnerand
2252c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set .
2262c8ac1b3SSascha WildnerIt will return the first unused unit number and also mark it as used.
2272c8ac1b3SSascha Wildner.Pp
2282c8ac1b3SSascha WildnerThe
2292c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP
2302c8ac1b3SSascha Wildnermacro declares a clone bitmap with the specified
2312c8ac1b3SSascha Wildner.Fa name .
2322c8ac1b3SSascha WildnerAs long as the name specified is unique, this macro can be used to declare
2332c8ac1b3SSascha Wildnerglobal variables.
2342c8ac1b3SSascha Wildner.Pp
2352c8ac1b3SSascha WildnerThe
2362c8ac1b3SSascha Wildner.Fn DEVFS_CLONE_BITMAP
2372c8ac1b3SSascha Wildneris a macro which expands the specified
2382c8ac1b3SSascha Wildner.Fa name
2392c8ac1b3SSascha Wildnerto the full name of a clone bitmap.
2402c8ac1b3SSascha WildnerIt is used in conjunction with
2412c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP ,
2422c8ac1b3SSascha Wildneras it uses the same name.
2432c8ac1b3SSascha Wildner.Sh HISTORY
2442c8ac1b3SSascha WildnerThe
2452c8ac1b3SSascha Wildner.Xr devfs 5
2462c8ac1b3SSascha Wildnerclone facilities and the associated functions all appeared in
2472c8ac1b3SSascha Wildner.Dx 2.3 .
2482c8ac1b3SSascha Wildner.Sh AUTHOR
2492c8ac1b3SSascha Wildner.An Alex Hornung
250