3 .\" Copyright (c) 2010-2022 Hans Petter Selasky
5 .\" All rights reserved.
7 .\" Redistribution and use in source and binary forms, with or without
8 .\" modification, are permitted provided that the following conditions
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.
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
33 .Nd "Userland character device library"
37 To load the required kernel module at boot time, place the following line in
39 .Bd -literal -offset indent
47 library contains functions to create a character device in userspace.
50 library is thread safe.
51 .Sh LIBRARY INITIALISATION / DEINITIALISATION
53 .Fn "cuse_init" "void"
54 This function initialises
56 Must be called at the beginning of the program.
57 This function returns 0 on success or a negative value on failure.
60 for known error codes.
61 If the cuse kernel module is not loaded,
62 .Dv CUSE_ERR_NOT_LOADED
66 .Fn "cuse_uninit" "void"
69 Can be called at the end of the application.
70 This function returns 0 on success or a negative value on failure.
73 for known error codes.
76 .Fn "cuse_alloc_unit_number" "int *"
77 This function stores a uniq system unit number at the pointed
79 This function returns 0 on success or a negative value on failure.
82 for known error codes.
85 .Fn "cuse_alloc_unit_number_by_id" "int *" "int id"
86 This function stores a unique system unit number at the pointed
88 The returned unit number is uniq within the given ID.
89 Valid ID values are defined by the cuse include file.
92 macros for more information.
93 This function returns 0 on success or a negative value on failure.
96 for known error codes.
99 .Fn "cuse_free_unit_number" "int"
100 This function frees the given allocated system unit number.
101 This function returns 0 on success or a negative value on failure.
104 for known error codes.
107 .Fn "cuse_free_unit_number_by_id" "int unit" "int id"
108 This function frees the given allocated system unit number belonging
110 If both the unit and id argument is -1, all allocated units will be freed.
111 This function returns 0 on success or a negative value on failure.
114 for known error codes.
117 .Fn "cuse_vmalloc" "unsigned size"
118 This function allocates
121 Only memory allocated by this function can be memory
124 This function returns a valid data pointer on success or
127 The returned pointer is always aligned to the system page size.
128 The number and size of allocations is limited by the
130 offset having to fit into a 32-bit variable typically for 32-bit
134 .Fn "cuse_is_vmalloc_addr" "void *"
135 This function returns non-zero if the passed pointer points to a valid
136 and non-freed allocation, as returned by
138 Else this function returns zero.
141 .Fn "cuse_vmfree" "void *"
142 This function frees memory allocated by
144 This function is NULL safe.
147 .Fn "cuse_vmoffset" "void *"
148 This function returns the mmap offset the client must use to
149 access the allocated memory.
150 The passed pointer must be aligned to the system page size.
152 .Ft "struct cuse_dev *"
153 .Fn "cuse_dev_create" "const struct cuse_methods *mtod" "void *priv0" "void *priv1" "uid_t" "gid_t" "int permission" "const char *fmt" "..."
154 This function creates a new character device according to the given
156 This function returns a valid cuse_dev structure pointer
160 The device name can only contain a-z,
161 A-Z, 0-9, dot, / and underscore characters.
164 .Fn "cuse_dev_destroy" "struct cuse_dev *"
165 This functions destroys a previously created character device.
168 .Fn "cuse_dev_get_priv0" "struct cuse_dev *" ,
170 .Fn "cuse_dev_get_priv1" "struct cuse_dev *" ,
172 .Fn "cuse_dev_set_priv0" "struct cuse_dev *" "void *" ,
174 .Fn "cuse_dev_set_priv1" "struct cuse_dev *" "void *"
175 These functions are used to set and get the private data of the given
179 .Fn "cuse_wait_and_process" "void"
180 This function will block and do event processing.
182 required multiple threads must be created looping on this
184 This function returns 0 on success or a negative value on failure.
187 for known error codes.
190 .Fn "cuse_dev_get_per_file_handle" "struct cuse_dev *" ,
192 .Fn "cuse_dev_set_per_file_handle" "struct cuse_dev *" "void *"
193 These functions are used to set and get the per-file-open specific handle
194 and should only be used inside the cuse file operation callbacks.
197 .Fn "cuse_set_local" "int"
198 This function instructs
203 user pointer is local, if the argument passed to it is non-zero.
204 Else the user pointer is assumed to be at the peer application.
205 This function should only be used inside the cuse file operation callbacks.
206 The value is reset to zero when the given file operation returns, and
207 does not affect any other file operation callbacks.
210 .Fn "cuse_get_local" "void"
211 Returns the current local state.
216 .Fn "cuse_copy_out" "const void *src" "void *peer_dst" "int len" ,
218 .Fn "cuse_copy_in" "const void *peer_src" "void *dst" "int len"
219 These functions are used to transfer data between the local
220 application and the peer application.
221 These functions must be used
222 when operating on the data pointers passed to the
228 These functions return 0 on success or a negative value on failure.
231 for known error codes.
234 .Fn "cuse_got_peer_signal" "void"
235 This function is used to check if a signal has been delivered to the
236 peer application and should only be used inside the cuse file
238 This function returns 0 if a signal has been
239 delivered to the caller.
240 Else it returns a negative value.
243 for known error codes.
245 .Ft "struct cuse_dev *"
246 .Fn "cuse_dev_get_current" "int *pcmd"
247 This function is used to get the current cuse device pointer and the
248 currently executing command, by
256 This function should only be used inside the
257 cuse file operation callbacks.
258 On success a valid cuse device pointer
265 .Fn "cuse_poll_wakeup" "void"
266 This function will wake up any file pollers.
267 .Sh LIBRARY LIMITATIONS
274 should not exceed what can fit into a 32-bit signed integer and is
278 Transfer lengths for ioctls should not exceed what is defined by the
281 .Sh LIBRARY CALLBACK METHODS
282 In general fflags are defined by
284 and errors are defined by
286 .Bd -literal -offset indent
324 .Fn "cuse_open_t" "struct cuse_dev *" "int fflags"
325 This function returns a
330 .Fn "cuse_close_t" "struct cuse_dev *" "int fflags"
331 This function returns a
336 .Fn "cuse_read_t" "struct cuse_dev *" "int fflags" "void *peer_ptr" "int len"
337 This function returns a
339 value in case of failure or the
340 actually transferred length in case of success.
344 must be used to transfer data to and from the
348 .Fn "cuse_write_t" "struct cuse_dev *" "int fflags" "const void *peer_ptr" "int len"
349 This function returns a
351 value in case of failure or the
352 actually transferred length in case of success.
356 must be used to transfer data to and from the
360 .Fn "cuse_ioctl_t" "struct cuse_dev *" "int fflags" "unsigned long cmd" "void *peer_data"
361 This function returns a
363 value in case of failure or zero
369 transfer data to and from the
373 .Fn "cuse_poll_t" "struct cuse_dev *" "int fflags" "int events"
374 This function returns a mask of
376 values in case of failure and success.
377 The events argument is also a mask of
380 .Bd -literal -offset indent
381 struct cuse_methods {
382 cuse_open_t *cm_open;
383 cuse_close_t *cm_close;
384 cuse_read_t *cm_read;
385 cuse_write_t *cm_write;
386 cuse_ioctl_t *cm_ioctl;
387 cuse_poll_t *cm_poll;
392 was written by Hans Petter Selasky.