1 /* Copyright (c) 2014, Vsevolod Stakhov
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *       * Redistributions of source code must retain the above copyright
7  *         notice, this list of conditions and the following disclaimer.
8  *       * Redistributions in binary form must reproduce the above copyright
9  *         notice, this list of conditions and the following disclaimer in the
10  *         documentation and/or other materials provided with the distribution.
11  *
12  * THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY
13  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15  * DISCLAIMED. IN NO EVENT SHALL AUTHOR BE LIABLE FOR ANY
16  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
17  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
18  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
19  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
21  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22  */
23 #ifndef _GNU_SOURCE
24 #  define _GNU_SOURCE
25 #endif
26 #include <sys/types.h>
27 #include <stdint.h>
28 #include <stdio.h>
29 
30 #include "bsd_compat.h"
31 
32 #ifndef HAVE_FUNOPEN
33 
34 FILE *
funopen(const void * cookie,int (* readfn)(void *,char *,int),int (* writefn)(void *,const char *,int),off_t (* seekfn)(void *,off_t,int),int (* closefn)(void *))35 funopen(const void *cookie, int (*readfn)(void *, char *, int),
36          int (*writefn)(void *, const char *, int),
37          off_t (*seekfn)(void *, off_t, int), int (*closefn)(void *))
38 {
39 	cookie_io_functions_t c;
40 	c.read = readfn;
41 	c.write = writefn;
42 	c.seek = seekfn;
43 	c.close = closefn;
44 
45 	return (fopencookie(__DECONST(void *, cookie), "a+", c));
46 }
47 
48 #endif
49