| /* Copyright (C) 2004       Manuel Novoa III    <mjn3@codepoet.org> | 
 |  * | 
 |  * GNU Library General Public License (LGPL) version 2 or later. | 
 |  * | 
 |  * Dedicated to Toni.  See uClibc/DEDICATION.mjn3 for details. | 
 |  */ | 
 |  | 
 | #include <features.h> | 
 |  | 
 | #ifdef __USE_GNU | 
 | #include "_stdio.h" | 
 |  | 
 | #ifndef __UCLIBC_HAS_GLIBC_CUSTOM_STREAMS__ | 
 | #error no custom streams! | 
 | #endif | 
 |  | 
 | /* NOTE: GLIBC difference!!! -- fopencookie | 
 |  * According to the info pages, glibc allows seeking within buffers even if | 
 |  * no seek function is supplied.  We don't. */ | 
 |  | 
 | /* NOTE: GLIBC difference!!! -- fopencookie | 
 |  * When compiled without large file support, the offset pointer for the | 
 |  * cookie_seek function is off_t * and not off64_t * as for glibc. */ | 
 |  | 
 | /* NOTE: GLIBC difference!!! -- fopencookie (bcc only) | 
 |  * Since bcc doesn't support passing of structs, we define fopencookie as a | 
 |  * macro in terms of _fopencookie which takes a struct * for the io functions | 
 |  * instead. | 
 |  */ | 
 |  | 
 | /* Currently no real reentrancy issues other than a possible double close(). */ | 
 |  | 
 | #ifndef __BCC__ | 
 | FILE *fopencookie(void * __restrict cookie, const char * __restrict mode, | 
 | 				  cookie_io_functions_t io_functions) | 
 | #else | 
 | FILE *_fopencookie(void * __restrict cookie, const char * __restrict mode, | 
 | 				   register cookie_io_functions_t *io_functions) | 
 | #endif | 
 | { | 
 | 	FILE *stream; | 
 |  | 
 | 	/* Fake an fdopen guaranteed to pass the _stdio_fopen basic agreement | 
 | 	 * check without an fcntl call. */ | 
 | 	stream = _stdio_fopen(((intptr_t)(INT_MAX-1)), mode, NULL, INT_MAX); | 
 | 	if (stream) { | 
 | 		stream->__filedes = -1; | 
 | #ifndef __BCC__ | 
 | 		stream->__gcs = io_functions; | 
 | #else | 
 | 		stream->__gcs.read  = io_functions->read; | 
 | 		stream->__gcs.write = io_functions->write; | 
 | 		stream->__gcs.seek  = io_functions->seek; | 
 | 		stream->__gcs.close = io_functions->close; | 
 | #endif | 
 | 		stream->__cookie = cookie; | 
 |  | 
 | 		__STDIO_STREAM_VALIDATE(stream); | 
 | 	} | 
 |  | 
 | 	return stream; | 
 | } | 
 | #ifndef __BCC__ | 
 | libc_hidden_def(fopencookie) | 
 | #endif | 
 | #endif |