xref: /netbsd-src/lib/libc/stdio/funopen.3 (revision b1c86f5f087524e68db12794ee9c3e3da1ab17a0)
1.\"	$NetBSD: funopen.3,v 1.15 2010/03/22 19:30:54 joerg Exp $
2.\"
3.\" Copyright (c) 1990, 1991, 1993
4.\"	The Regents of the University of California.  All rights reserved.
5.\"
6.\" This code is derived from software contributed to Berkeley by
7.\" Chris Torek.
8.\" Redistribution and use in source and binary forms, with or without
9.\" modification, are permitted provided that the following conditions
10.\" are met:
11.\" 1. Redistributions of source code must retain the above copyright
12.\"    notice, this list of conditions and the following disclaimer.
13.\" 2. Redistributions in binary form must reproduce the above copyright
14.\"    notice, this list of conditions and the following disclaimer in the
15.\"    documentation and/or other materials provided with the distribution.
16.\" 3. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\"     @(#)funopen.3	8.1 (Berkeley) 6/9/93
33.\"
34.Dd June 9, 1993
35.Dt FUNOPEN 3
36.Os
37.Sh NAME
38.Nm funopen ,
39.Nm fropen ,
40.Nm fwopen
41.Nd open a stream
42.Sh LIBRARY
43.Lb libc
44.Sh SYNOPSIS
45.In stdio.h
46.Ft FILE *
47.Fn funopen "void  *cookie" "int  (*readfn)(void *, char *, int)" "int (*writefn)(void *, const char *, int)" "fpos_t (*seekfn)(void *, fpos_t, int)" "int (*closefn)(void *)"
48.Ft FILE *
49.Fn fropen "void  *cookie" "int  (*readfn)(void *, char *, int)"
50.Ft FILE *
51.Fn fwopen "void  *cookie" "int  (*writefn)(void *, const char *, int)"
52.Sh DESCRIPTION
53The
54.Fn funopen
55function
56associates a stream with up to four
57.Dq Tn I/O No functions .
58Either
59.Fa readfn
60or
61.Fa writefn
62must be specified;
63the others can be given as an appropriately-typed
64.Dv NULL
65pointer.
66These
67.Tn I/O
68functions will be used to read, write, seek and
69close the new stream.
70.Pp
71In general, omitting a function means that any attempt to perform the
72associated operation on the resulting stream will fail.
73If the close function is omitted, closing the stream will flush
74any buffered output and then succeed.
75.Pp
76The calling conventions of
77.Fa readfn ,
78.Fa writefn ,
79.Fa seekfn
80and
81.Fa closefn
82must match those, respectively, of
83.Xr read 2 ,
84.Xr write 2 ,
85.Xr lseek 2 ,
86and
87.Xr close 2 ;
88except that they are passed the
89.Fa cookie
90argument specified to
91.Fn funopen
92in place of the traditional file descriptor argument,
93and
94.Fa seekfn
95uses
96.Li fpos_t
97instead of
98.Li off_t .
99.Pp
100Read and write
101.Tn I/O
102functions are allowed to change the underlying buffer
103on fully buffered or line buffered streams by calling
104.Xr setvbuf 3 .
105They are also not required to completely fill or empty the buffer.
106They are not, however, allowed to change streams from unbuffered to buffered
107or to change the state of the line buffering flag.
108They must also be prepared to have read or write calls occur on buffers other
109than the one most recently specified.
110.Pp
111All user
112.Tn I/O
113functions can report an error by returning \-1.
114Additionally, all of the functions should set the external variable
115.Va errno
116appropriately if an error occurs.
117.Pp
118An error on
119.Fn closefn
120does not keep the stream open.
121.Pp
122As a convenience, the include file
123.In stdio.h
124defines the macros
125.Fn fropen
126and
127.Fn fwopen
128as calls to
129.Fn funopen
130with only a read or write function specified.
131.Sh RETURN VALUES
132Upon successful completion,
133.Fn funopen
134returns a
135.Dv FILE
136pointer.
137Otherwise,
138.Dv NULL
139is returned and the global variable
140.Va errno
141is set to indicate the error.
142.Sh ERRORS
143.Bl -tag -width Er
144.It Bq Er EINVAL
145The
146.Fn funopen
147function
148was called without either a read or write function.
149The
150.Fn funopen
151function
152may also fail and set
153.Va errno
154for any of the errors
155specified for the routine
156.Xr malloc 3 .
157.El
158.Sh SEE ALSO
159.Xr fcntl 2 ,
160.Xr open 2 ,
161.Xr fclose 3 ,
162.Xr fopen 3 ,
163.Xr fseek 3 ,
164.Xr setbuf 3
165.Sh HISTORY
166The
167.Fn funopen
168functions first appeared in
169.Bx 4.4 .
170.Sh BUGS
171The
172.Fn funopen
173function
174may not be portable to systems other than
175.Bx .
176