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