1.\" $FreeBSD$ 2.\" 3.\" Copyright (c) 2010-2013 Hans Petter Selasky 4.\" 5.\" All rights reserved. 6.\" 7.\" Redistribution and use in source and binary forms, with or without 8.\" modification, are permitted provided that the following conditions 9.\" are met: 10.\" 1. Redistributions of source code must retain the above copyright 11.\" notice, this list of conditions and the following disclaimer. 12.\" 2. Redistributions in binary form must reproduce the above copyright 13.\" notice, this list of conditions and the following disclaimer in the 14.\" documentation and/or other materials provided with the distribution. 15.\" 16.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26.\" SUCH DAMAGE. 27.\" 28.Dd October 5, 2017 29.Dt CUSE 3 30.Os 31.Sh NAME 32.Nm libcuse 33.Nd "Userland character device library" 34.Sh LIBRARY 35.Lb libcuse 36.Sh SYNOPSIS 37To load the required kernel module at boot time, place the following line in 38.Xr loader.conf 5 : 39.Bd -literal -offset indent 40cuse_load="YES" 41.Ed 42.Pp 43.In cuse.h 44.Sh DESCRIPTION 45The 46.Nm 47library contains functions to create a character device in userspace. 48The 49.Nm 50library is thread safe. 51.Sh LIBRARY INITIALISATION / DEINITIALISATION 52.Ft "int" 53.Fn "cuse_init" "void" 54This function initialises 55.Nm . 56Must be called at the beginning of the program. 57This function returns 0 on success or a negative value on failure. 58See 59.Dv CUSE_ERR_XXX 60for known error codes. 61If the cuse kernel module is not loaded, 62.Dv CUSE_ERR_NOT_LOADED 63is returned. 64.Pp 65.Ft "int" 66.Fn "cuse_uninit" "void" 67Deinitialise 68.Nm . 69Can be called at the end of the application. 70This function returns 0 on success or a negative value on failure. 71See 72.Dv CUSE_ERR_XXX 73for known error codes. 74.Sh UNIT MANAGEMENT 75.Ft "int" 76.Fn "cuse_alloc_unit_number" "int *" 77This function stores a uniq system unit number at the pointed 78integer loation. 79This function returns 0 on success or a negative value on failure. 80See 81.Dv CUSE_ERR_XXX 82for known error codes. 83.Pp 84.Ft "int" 85.Fn "cuse_alloc_unit_number_by_id" "int *" "int id" 86This function stores a unique system unit number at the pointed 87integer loation. 88The returned unit number is uniq within the given ID. 89Valid ID values are defined by the cuse include file. 90See the 91.Fn CUSE_ID_XXX 92macros for more information. 93This function returns 0 on success or a negative value on failure. 94See 95.Dv CUSE_ERR_XXX 96for known error codes. 97.Pp 98.Ft "int" 99.Fn "cuse_free_unit_number" "int" 100This function frees the given allocated system unit number. 101This function returns 0 on success or a negative value on failure. 102See 103.Dv CUSE_ERR_XXX 104for known error codes. 105.Pp 106.Ft "int" 107.Fn "cuse_free_unit_number_by_id" "int unit" "int id" 108This function frees the given allocated system unit number belonging 109to the given ID. 110If both the unit and id argument is -1, all allocated units will be freed. 111This function returns 0 on success or a negative value on failure. 112See 113.Dv CUSE_ERR_XXX 114for known error codes. 115.Sh LIBRARY USAGE 116.Ft "void *" 117.Fn "cuse_vmalloc" "int size" 118This function allocates 119.Ar size 120bytes of memory. 121Only memory allocated by this function can be memory 122mapped by 123.Xr mmap 2 . 124This function returns a valid data pointer on success or 125.Dv NULL 126on failure. 127.Pp 128.Ft "int" 129.Fn "cuse_is_vmalloc_addr" "void *" 130This function returns non-zero if the passed pointer points to a valid 131and non-freed allocation, as returned by 132.Fn cuse_vmalloc . 133Else this function returns zero. 134.Pp 135.Ft "void" 136.Fn "cuse_vmfree" "void *" 137This function frees memory allocated by 138.Fn cuse_vmalloc . 139Note that the 140cuse library will internally not free the memory until the 141.Fn cuse_uninit 142function is called and that the number of unique 143allocations is limited. 144.Pp 145.Ft "unsigned long" 146.Fn "cuse_vmoffset" "void *" 147This function returns the mmap offset that the client must use to 148access the allocated memory. 149.Pp 150.Ft "struct cuse_dev *" 151.Fn "cuse_dev_create" "const struct cuse_methods *mtod" "void *priv0" "void *priv1" "uid_t" "gid_t" "int permission" "const char *fmt" "..." 152This function creates a new character device according to the given 153parameters. 154This function returns a valid cuse_dev structure pointer 155on success or 156.Dv NULL 157on failure. 158The device name can only contain a-z, 159A-Z, 0-9, dot, / and underscore characters. 160.Pp 161.Ft "void" 162.Fn "cuse_dev_destroy" "struct cuse_dev *" 163This functions destroys a previously created character device. 164.Pp 165.Ft "void *" 166.Fn "cuse_dev_get_priv0" "struct cuse_dev *" , 167.Ft "void *" 168.Fn "cuse_dev_get_priv1" "struct cuse_dev *" , 169.Ft "void" 170.Fn "cuse_dev_set_priv0" "struct cuse_dev *" "void *" , 171.Ft "void" 172.Fn "cuse_dev_set_priv1" "struct cuse_dev *" "void *" 173These functions are used to set and get the private data of the given 174cuse device. 175.Pp 176.Ft "int" 177.Fn "cuse_wait_and_process" "void" 178This function will block and do event processing. 179If parallel I/O is 180required multiple threads must be created looping on this 181function. 182This function returns 0 on success or a negative value on failure. 183See 184.Dv CUSE_ERR_XXX 185for known error codes. 186.Pp 187.Ft "void *" 188.Fn "cuse_dev_get_per_file_handle" "struct cuse_dev *" , 189.Ft "void" 190.Fn "cuse_dev_set_per_file_handle" "struct cuse_dev *" "void *" 191These functions are used to set and get the per-file-open specific handle 192and should only be used inside the cuse file operation callbacks. 193.Pp 194.Ft "void" 195.Fn "cuse_set_local" "int" 196This function instructs 197.Fn cuse_copy_out 198and 199.Fn cuse_copy_in 200that the 201user pointer is local, if the argument passed to it is non-zero. 202Else the user pointer is assumed to be at the peer application. 203This function should only be used inside the cuse file operation callbacks. 204The value is reset to zero when the given file operation returns, and 205does not affect any other file operation callbacks. 206.Pp 207.Ft "int" 208.Fn "cuse_get_local" "void" 209Returns the current local state. 210See 211.Fn cuse_set_local . 212.Pp 213.Ft "int" 214.Fn "cuse_copy_out" "const void *src" "void *peer_dst" "int len" , 215.Ft "int" 216.Fn "cuse_copy_in" "const void *peer_src" "void *dst" "int len" 217These functions are used to transfer data between the local 218application and the peer application. 219These functions must be used 220when operating on the data pointers passed to the 221.Fn cm_read , 222.Fn cm_write , 223and 224.Fn cm_ioctl 225callback functions. 226These functions return 0 on success or a negative value on failure. 227See 228.Dv CUSE_ERR_XXX 229for known error codes. 230.Pp 231.Ft "int" 232.Fn "cuse_got_peer_signal" "void" 233This function is used to check if a signal has been delivered to the 234peer application and should only be used inside the cuse file 235operation callbacks. 236This function returns 0 if a signal has been 237delivered to the caller. 238Else it returns a negative value. 239See 240.Dv CUSE_ERR_XXX 241for known error codes. 242.Pp 243.Ft "struct cuse_dev *" 244.Fn "cuse_dev_get_current" "int *pcmd" 245This function is used to get the current cuse device pointer and the 246currently executing command, by 247.Dv CUSE_CMD_XXX 248value. 249The 250.Ar pcmd 251argument 252is allowed to be 253.Dv NULL . 254This function should only be used inside the 255cuse file operation callbacks. 256On success a valid cuse device pointer 257is returned. 258On failure 259.Dv NULL 260is returned. 261.Pp 262.Ft "void" 263.Fn "cuse_poll_wakeup" "void" 264This function will wake up any file pollers. 265.Sh LIBRARY LIMITATIONS 266Transfer lengths for 267.Fn read , 268.Fn write , 269.Fn cuse_copy_in , 270and 271.Fn cuse_copy_out 272should not exceed what can fit into a 32-bit signed integer and is 273defined by the 274.Fn CUSE_LENGTH_MAX 275macro. 276Transfer lengths for ioctls should not exceed what is defined by the 277.Fn CUSE_BUFFER_MAX 278macro. 279.Sh LIBRARY CALLBACK METHODS 280In general fflags are defined by 281.Dv CUSE_FFLAG_XXX 282and errors are defined by 283.Dv CUSE_ERR_XXX . 284.Bd -literal -offset indent 285enum { 286 CUSE_ERR_NONE 287 CUSE_ERR_BUSY 288 CUSE_ERR_WOULDBLOCK 289 CUSE_ERR_INVALID 290 CUSE_ERR_NO_MEMORY 291 CUSE_ERR_FAULT 292 CUSE_ERR_SIGNAL 293 CUSE_ERR_OTHER 294 CUSE_ERR_NOT_LOADED 295 CUSE_ERR_NO_DEVICE 296 297 CUSE_POLL_NONE 298 CUSE_POLL_READ 299 CUSE_POLL_WRITE 300 CUSE_POLL_ERROR 301 302 CUSE_FFLAG_NONE 303 CUSE_FFLAG_READ 304 CUSE_FFLAG_WRITE 305 CUSE_FFLAG_NONBLOCK 306 307 CUSE_CMD_NONE 308 CUSE_CMD_OPEN 309 CUSE_CMD_CLOSE 310 CUSE_CMD_READ 311 CUSE_CMD_WRITE 312 CUSE_CMD_IOCTL 313 CUSE_CMD_POLL 314 CUSE_CMD_SIGNAL 315 CUSE_CMD_SYNC 316 CUSE_CMD_MAX 317}; 318.Ed 319.Pp 320.Ft "int" 321.Fn "cuse_open_t" "struct cuse_dev *" "int fflags" 322This function returns a 323.Dv CUSE_ERR_XXX 324value. 325.Pp 326.Ft "int" 327.Fn "cuse_close_t" "struct cuse_dev *" "int fflags" 328This function returns a 329.Dv CUSE_ERR_XXX 330value. 331.Pp 332.Ft "int" 333.Fn "cuse_read_t" "struct cuse_dev *" "int fflags" "void *peer_ptr" "int len" 334This function returns a 335.Dv CUSE_ERR_XXX 336value in case of failure or the 337actually transferred length in case of success. 338.Fn cuse_copy_in 339and 340.Fn cuse_copy_out 341must be used to transfer data to and from the 342.Ar peer_ptr . 343.Pp 344.Ft "int" 345.Fn "cuse_write_t" "struct cuse_dev *" "int fflags" "const void *peer_ptr" "int len" 346This function returns a 347.Dv CUSE_ERR_XXX 348value in case of failure or the 349actually transferred length in case of success. 350.Fn cuse_copy_in 351and 352.Fn cuse_copy_out 353must be used to transfer data to and from the 354.Ar peer_ptr . 355.Pp 356.Ft "int" 357.Fn "cuse_ioctl_t" "struct cuse_dev *" "int fflags" "unsigned long cmd" "void *peer_data" 358This function returns a 359.Dv CUSE_ERR_XXX 360value in case of failure or zero 361in case of success. 362.Fn cuse_copy_in 363and 364.Fn cuse_copy_out 365must be used to 366transfer data to and from the 367.Ar peer_data . 368.Pp 369.Ft "int" 370.Fn "cuse_poll_t" "struct cuse_dev *" "int fflags" "int events" 371This function returns a mask of 372.Dv CUSE_POLL_XXX 373values in case of failure and success. 374The events argument is also a mask of 375.Dv CUSE_POLL_XXX 376values. 377.Bd -literal -offset indent 378struct cuse_methods { 379 cuse_open_t *cm_open; 380 cuse_close_t *cm_close; 381 cuse_read_t *cm_read; 382 cuse_write_t *cm_write; 383 cuse_ioctl_t *cm_ioctl; 384 cuse_poll_t *cm_poll; 385}; 386.Ed 387.Sh HISTORY 388.Nm 389was written by Hans Petter Selasky. 390