From 082e680bd54e999f2bb4eb77141958938b1e9ee9 Mon Sep 17 00:00:00 2001 From: Manuel Novoa III Date: Wed, 11 Feb 2004 23:48:50 +0000 Subject: New stdio core. Should be more maintainable. Fixes a couple of bugs. Codepaths streamlined. Improved performance for nonthreaded apps when linked with a thread-enabled libc. Minor iconv bug and some locale/thread related startup issues fixed. These showed up in getting a gcj-compiled java helloworld app running. Removed some old extension functions... _stdio_fdout and _stdio_fsfopen. --- libc/stdio/fopencookie.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 libc/stdio/fopencookie.c (limited to 'libc/stdio/fopencookie.c') diff --git a/libc/stdio/fopencookie.c b/libc/stdio/fopencookie.c new file mode 100644 index 000000000..73a5a028a --- /dev/null +++ b/libc/stdio/fopencookie.c @@ -0,0 +1,59 @@ +/* Copyright (C) 2004 Manuel Novoa III + * + * GNU Library General Public License (LGPL) version 2 or later. + * + * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details. + */ + +#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; +} -- cgit v1.2.3