blob: eca3d6f8796e42ce0c7d3e2bd14055de5925ba8b [file] [log] [blame]
<html lang="en">
<head>
<title>Streams and Cookies - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Custom-Streams.html#Custom-Streams" title="Custom Streams">
<link rel="next" href="Hook-Functions.html#Hook-Functions" title="Hook Functions">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Streams-and-Cookies"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Hook-Functions.html#Hook-Functions">Hook Functions</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Custom-Streams.html#Custom-Streams">Custom Streams</a>
<hr>
</div>
<h5 class="subsubsection">12.21.3.1 Custom Streams and Cookies</h5>
<p><a name="index-cookie_002c-for-custom-stream-1162"></a>
Inside every custom stream is a special object called the <dfn>cookie</dfn>.
This is an object supplied by you which records where to fetch or store
the data read or written. It is up to you to define a data type to use
for the cookie. The stream functions in the library never refer
directly to its contents, and they don't even know what the type is;
they record its address with type <code>void *</code>.
<p>To implement a custom stream, you must specify <em>how</em> to fetch or
store the data in the specified place. You do this by defining
<dfn>hook functions</dfn> to read, write, change &ldquo;file position&rdquo;, and close
the stream. All four of these functions will be passed the stream's
cookie so they can tell where to fetch or store the data. The library
functions don't know what's inside the cookie, but your functions will
know.
<p>When you create a custom stream, you must specify the cookie pointer,
and also the four hook functions stored in a structure of type
<code>cookie_io_functions_t</code>.
<p>These facilities are declared in <samp><span class="file">stdio.h</span></samp>.
<a name="index-stdio_002eh-1163"></a>
<!-- stdio.h -->
<!-- GNU -->
<div class="defun">
&mdash; Data Type: <b>cookie_io_functions_t</b><var><a name="index-cookie_005fio_005ffunctions_005ft-1164"></a></var><br>
<blockquote><p>This is a structure type that holds the functions that define the
communications protocol between the stream and its cookie. It has
the following members:
<dl>
<dt><code>cookie_read_function_t *read</code><dd>This is the function that reads data from the cookie. If the value is a
null pointer instead of a function, then read operations on this stream
always return <code>EOF</code>.
<br><dt><code>cookie_write_function_t *write</code><dd>This is the function that writes data to the cookie. If the value is a
null pointer instead of a function, then data written to the stream is
discarded.
<br><dt><code>cookie_seek_function_t *seek</code><dd>This is the function that performs the equivalent of file positioning on
the cookie. If the value is a null pointer instead of a function, calls
to <code>fseek</code> or <code>fseeko</code> on this stream can only seek to
locations within the buffer; any attempt to seek outside the buffer will
return an <code>ESPIPE</code> error.
<br><dt><code>cookie_close_function_t *close</code><dd>This function performs any appropriate cleanup on the cookie when
closing the stream. If the value is a null pointer instead of a
function, nothing special is done to close the cookie when the stream is
closed.
</dl>
</p></blockquote></div>
<!-- stdio.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: FILE * <b>fopencookie</b> (<var>void *cookie, const char *opentype, cookie_io_functions_t io-functions</var>)<var><a name="index-fopencookie-1165"></a></var><br>
<blockquote><p>This function actually creates the stream for communicating with the
<var>cookie</var> using the functions in the <var>io-functions</var> argument.
The <var>opentype</var> argument is interpreted as for <code>fopen</code>;
see <a href="Opening-Streams.html#Opening-Streams">Opening Streams</a>. (But note that the &ldquo;truncate on
open&rdquo; option is ignored.) The new stream is fully buffered.
<p>The <code>fopencookie</code> function returns the newly created stream, or a null
pointer in case of an error.
</p></blockquote></div>
</body></html>