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.\" 325fccb22fSSascha Wildner.Dd August 13, 2010 332c8ac1b3SSascha Wildner.Dt MAKE_AUTOCLONE_DEV 9 34fb5b3747SSascha Wildner.Os 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_get , 442c8ac1b3SSascha Wildner.Nm devfs_clone_bitmap_put , 452c8ac1b3SSascha Wildner.Nm DEVFS_DECLARE_CLONE_BITMAP , 462c8ac1b3SSascha Wildner.Nm DEVFS_CLONE_BITMAP 472c8ac1b3SSascha Wildner.Nd device clone functions 482c8ac1b3SSascha Wildner.Sh SYNOPSIS 492c8ac1b3SSascha Wildner.In sys/types.h 502c8ac1b3SSascha Wildner.In sys/conf.h 512c8ac1b3SSascha Wildner.In sys/devfs.h 522c8ac1b3SSascha Wildner.Ft cdev_t 534aff68f4SSascha 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" "..." 542c8ac1b3SSascha Wildner.Ft void 552c8ac1b3SSascha Wildner.Fn destroy_autoclone_dev "cdev_t dev" "struct devfs_bitmap *bitmap" 562c8ac1b3SSascha Wildner.Ft void 572c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init "struct devfs_bitmap *bitmap" 582c8ac1b3SSascha Wildner.Ft void 592c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit "struct devfs_bitmap *bitmap" 60*7d807da9SSascha Wildner.Ft int 612c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff "struct devfs_bitmap *bitmap" 622c8ac1b3SSascha Wildner.Ft int 634aff68f4SSascha Wildner.Fn devfs_clone_bitmap_chk "struct devfs_bitmap *bitmap" "int unit" 642c8ac1b3SSascha Wildner.Ft void 654aff68f4SSascha Wildner.Fn devfs_clone_bitmap_set "struct devfs_bitmap *bitmap" "int unit" 662c8ac1b3SSascha Wildner.Ft int 674aff68f4SSascha Wildner.Fn devfs_clone_bitmap_get "struct devfs_bitmap *bitmap" "int limit" 682c8ac1b3SSascha Wildner.Ft void 694aff68f4SSascha Wildner.Fn devfs_clone_bitmap_put "struct devfs_bitmap *bitmap" "int unit" 702c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP "name" 712c8ac1b3SSascha Wildner.Fn DEVFS_CLONE_BITMAP "name" 722c8ac1b3SSascha Wildner.Sh DESCRIPTION 732c8ac1b3SSascha Wildner.Fn make_autoclone_dev 742c8ac1b3SSascha Wildnercreates a 752c8ac1b3SSascha Wildner.Vt cdev_t 762c8ac1b3SSascha Wildnerwith the default 772c8ac1b3SSascha Wildner.Fa ops , 782c8ac1b3SSascha Wildnervisible in the 792c8ac1b3SSascha Wildner.Xr devfs 5 802c8ac1b3SSascha Wildnernamespace, that (when opened) will invoke the clone handler specified by 812c8ac1b3SSascha Wildner.Fa nhandler . 822c8ac1b3SSascha WildnerIf a 832c8ac1b3SSascha Wildner.Vt devfs_bitmap * 842c8ac1b3SSascha Wildneris specified, the given 852c8ac1b3SSascha Wildner.Fa bitmap 862c8ac1b3SSascha Wildneris initialized using 872c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init . 882c8ac1b3SSascha Wildner.Pp 892c8ac1b3SSascha WildnerThe clone handler must be defined as follows: 902c8ac1b3SSascha Wildner.Bd -literal 912c8ac1b3SSascha Wildnerd_clone_t mydev_clone; 922c8ac1b3SSascha Wildner 932c8ac1b3SSascha Wildnerint 942c8ac1b3SSascha Wildnermydev_clone(struct dev_clone_args *ap) 952c8ac1b3SSascha Wildner{ 962c8ac1b3SSascha Wildner}; 972c8ac1b3SSascha Wildner.Ed 982c8ac1b3SSascha Wildner.Pp 992c8ac1b3SSascha WildnerWhen called, the handler is passed a pointer to a populated 1002c8ac1b3SSascha Wildner.Vt dev_clone_args 1012c8ac1b3SSascha Wildnerstructure, which is defined as follows: 1022c8ac1b3SSascha Wildner.Bd -literal 1032c8ac1b3SSascha Wildnerstruct dev_clone_args { 1042c8ac1b3SSascha Wildner struct dev_generic_args a_head; 1052c8ac1b3SSascha Wildner struct cdev *a_dev; 1062c8ac1b3SSascha Wildner const char *a_name; 1072c8ac1b3SSascha Wildner size_t a_namelen; 1082c8ac1b3SSascha Wildner struct ucred *a_cred; 1092c8ac1b3SSascha Wildner int a_mode; 1102c8ac1b3SSascha Wildner}; 1112c8ac1b3SSascha Wildner.Ed 1122c8ac1b3SSascha Wildner.Pp 1132c8ac1b3SSascha Wildner.Fa a_head.a_dev 1142c8ac1b3SSascha Wildneris the 1152c8ac1b3SSascha Wildner.Vt cdev_t 1162c8ac1b3SSascha Wildnerof the accessed autoclone device. 1172c8ac1b3SSascha Wildner.Fa a_name 1182c8ac1b3SSascha Wildnerand 1192c8ac1b3SSascha Wildner.Fa a_namelen 1202c8ac1b3SSascha Wildnerare the registered clonable base name and its length, as specified to 1212c8ac1b3SSascha Wildner.Fn make_autoclone_dev . 1222c8ac1b3SSascha Wildner.Fa a_mode 1232c8ac1b3SSascha Wildnerand 1242c8ac1b3SSascha Wildner.Fa a_cred 1252c8ac1b3SSascha Wildnercontain the mode and cred passed to the autoclone device's 1262c8ac1b3SSascha Wildner.Fn open . 1272c8ac1b3SSascha Wildner.Pp 1282c8ac1b3SSascha WildnerThe clone handler must set 1292c8ac1b3SSascha Wildner.Fa a_dev 1302c8ac1b3SSascha Wildnerto a new 1312c8ac1b3SSascha Wildner.Vt cdev_t , 1322c8ac1b3SSascha Wildnerreturned by a call to 1332c8ac1b3SSascha Wildner.Fn make_only_dev . 1342c8ac1b3SSascha Wildner.Fa a_dev 1352c8ac1b3SSascha Wildnermay also be set to 1362c8ac1b3SSascha Wildner.Dv NULL , 1372c8ac1b3SSascha Wildnerin which case the 1382c8ac1b3SSascha Wildner.Fn open 1392c8ac1b3SSascha Wildnerwill ultimately fail with 1402c8ac1b3SSascha Wildner.Er ENXIO . 1412c8ac1b3SSascha WildnerIf 1422c8ac1b3SSascha Wildner.Fa a_dev 1432c8ac1b3SSascha Wildneris 1442c8ac1b3SSascha Wildner.Pf non- Ns Dv NULL , 1452c8ac1b3SSascha Wildnerit is automatically made visible and linked into 1462c8ac1b3SSascha Wildner.Xr devfs 5 1472c8ac1b3SSascha Wildneras if it was created with 1482c8ac1b3SSascha Wildner.Fn make_dev . 1492c8ac1b3SSascha WildnerThus, 1502c8ac1b3SSascha Wildner.Fn destroy_dev 1512c8ac1b3SSascha Wildnershould be used to destroy the cloned 1522c8ac1b3SSascha Wildner.Vt cdev_t 1532c8ac1b3SSascha Wildneronce it is no longer required, 1542c8ac1b3SSascha Wildnerusually during 1552c8ac1b3SSascha Wildner.Fn close . 1562c8ac1b3SSascha Wildner.Pp 1572c8ac1b3SSascha Wildner.Fn destroy_autoclone_dev 1582c8ac1b3SSascha Wildnerdestroys a 1592c8ac1b3SSascha Wildner.Vt cdev_t 1602c8ac1b3SSascha Wildnercreated by 1612c8ac1b3SSascha Wildner.Fn make_autoclone_dev 1622c8ac1b3SSascha Wildnerunregistering its clone handler and (if non-NULL) also uninitializes its 1632c8ac1b3SSascha Wildner.Fa bitmap 1642c8ac1b3SSascha Wildnerusing 1652c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit . 1662c8ac1b3SSascha Wildner.Pp 1672c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_init 1682c8ac1b3SSascha Wildnerinitializes the given clone 1692c8ac1b3SSascha Wildner.Fa bitmap 1702c8ac1b3SSascha Wildnerso it is ready to use. 1712c8ac1b3SSascha Wildner.Pp 1722c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_uninit 1732c8ac1b3SSascha Wildnerfrees the memory associated with the specified clone 1742c8ac1b3SSascha Wildner.Fa bitmap 1752c8ac1b3SSascha Wildnerand leaves it unusable. 1762c8ac1b3SSascha Wildner.Pp 1772c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff 1782c8ac1b3SSascha Wildnerreturns the first unused unit in 1792c8ac1b3SSascha Wildner.Fa bitmap . 1802c8ac1b3SSascha WildnerTo use this unit, it has to be acquired by a call to 1812c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set . 1822c8ac1b3SSascha Wildner.Pp 1832c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_chk 1842c8ac1b3SSascha Wildnerchecks if 1852c8ac1b3SSascha Wildner.Fa unit 1862c8ac1b3SSascha Wildneris in use (set) and returns 1 if it is; otherwise 0 is returned. 1872c8ac1b3SSascha Wildner.Pp 1882c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set 1892c8ac1b3SSascha Wildnermarks 1902c8ac1b3SSascha Wildner.Fa unit 1912c8ac1b3SSascha Wildnerin 1922c8ac1b3SSascha Wildner.Fa bitmap 1932c8ac1b3SSascha Wildneras used, so further calls to 1942c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff 1952c8ac1b3SSascha Wildneror 1962c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get 1972c8ac1b3SSascha Wildnercannot retrieve it. 1982c8ac1b3SSascha WildnerIf one intends to use a clone handler along with preallocated devices, it 1992c8ac1b3SSascha Wildneris recommended to block the unit numbers of the preallocated devices by 2002c8ac1b3SSascha Wildnercalling 2012c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set 2022c8ac1b3SSascha Wildneron them. 2032c8ac1b3SSascha Wildner.Pp 2045fccb22fSSascha Wildner.Fn devfs_clone_bitmap_put 2052c8ac1b3SSascha Wildnermarks 2062c8ac1b3SSascha Wildner.Fa unit 2072c8ac1b3SSascha Wildnerin the 2082c8ac1b3SSascha Wildner.Fa bitmap 2092c8ac1b3SSascha Wildneras unused so further calls to 2102c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff 2112c8ac1b3SSascha Wildneror 2122c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get 2132c8ac1b3SSascha Wildnercan retrieve it again. 2142c8ac1b3SSascha Wildner.Pp 2152c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_get 2162c8ac1b3SSascha Wildneris a shortcut to 2172c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_fff 2182c8ac1b3SSascha Wildnerand 2192c8ac1b3SSascha Wildner.Fn devfs_clone_bitmap_set . 2202c8ac1b3SSascha WildnerIt will return the first unused unit number and also mark it as used. 2212c8ac1b3SSascha Wildner.Pp 2222c8ac1b3SSascha WildnerThe 2232c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP 2242c8ac1b3SSascha Wildnermacro declares a clone bitmap with the specified 2252c8ac1b3SSascha Wildner.Fa name . 2262c8ac1b3SSascha WildnerAs long as the name specified is unique, this macro can be used to declare 2272c8ac1b3SSascha Wildnerglobal variables. 2282c8ac1b3SSascha Wildner.Pp 2292c8ac1b3SSascha WildnerThe 2302c8ac1b3SSascha Wildner.Fn DEVFS_CLONE_BITMAP 2312c8ac1b3SSascha Wildneris a macro which expands the specified 2322c8ac1b3SSascha Wildner.Fa name 2332c8ac1b3SSascha Wildnerto the full name of a clone bitmap. 2342c8ac1b3SSascha WildnerIt is used in conjunction with 2352c8ac1b3SSascha Wildner.Fn DEVFS_DECLARE_CLONE_BITMAP , 2362c8ac1b3SSascha Wildneras it uses the same name. 2372c8ac1b3SSascha Wildner.Sh HISTORY 2382c8ac1b3SSascha WildnerThe 2392c8ac1b3SSascha Wildner.Xr devfs 5 2402c8ac1b3SSascha Wildnerclone facilities and the associated functions all appeared in 2412c8ac1b3SSascha Wildner.Dx 2.3 . 2422c8ac1b3SSascha Wildner.Sh AUTHOR 2432c8ac1b3SSascha Wildner.An Alex Hornung 244