diff options
Diffstat (limited to 'common/estream.c')
-rw-r--r-- | common/estream.c | 143 |
1 files changed, 22 insertions, 121 deletions
diff --git a/common/estream.c b/common/estream.c index 31e91d5ee..65c566489 100644 --- a/common/estream.c +++ b/common/estream.c @@ -1,5 +1,5 @@ /* estream.c - Extended Stream I/O Library - * Copyright (C) 2004, 2006, 2007 g10 Code GmbH + * Copyright (C) 2004, 2005, 2006, 2007 g10 Code GmbH * * This file is part of Libestream. * @@ -11,7 +11,7 @@ * Libestream is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. + * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Libestream; if not, write to the Free Software @@ -49,6 +49,7 @@ # include <pth.h> #endif +/* This is for the special hack to use estream.c in GnuPG. */ #ifdef GNUPG_MAJOR_VERSION #include "../common/util.h" #endif @@ -62,7 +63,7 @@ void *memrchr (const void *block, int c, size_t size); #endif #include <estream.h> - +#include <estream-printf.h> @@ -747,8 +748,8 @@ static int es_convert_mode (const char *mode, unsigned int *flags) { - /* FIXME: We need to allow all combinations for mode flags and for - binary we need to do a + /* FIXME: We need to allow all mode flags permutations and for + binary mode we need to do a #ifdef HAVE_DOSISH_SYSTEM setmode (fd, O_BINARY); @@ -1671,29 +1672,19 @@ doreadline (estream_t ES__RESTRICT stream, size_t max_length, } -/* Helper for esprint. */ -#if defined(HAVE_FOPENCOOKIE) || defined(HAVE_FUNOPEN) -static my_funopen_hook_ret_t -print_fun_writer (void *cookie_arg, const char *buffer, size_t size) +/* Output fucntion used for estream_format. */ +static int +print_writer (void *outfncarg, const char *buf, size_t buflen) { - estream_t stream = cookie_arg; + estream_t stream = outfncarg; size_t nwritten; - - /* We don't return an error but let es_print check whether an error - has occured. Internally we skip everything after an error. */ - if (!stream->intern->print_err) - { - if (es_writen (stream, buffer, size, &nwritten)) - { - stream->intern->print_err = 1; - stream->intern->print_errno = errno; - } - else - stream->intern->print_ntotal += nwritten; - } - return 0; + int rc; + + nwritten = 0; + rc = es_writen (stream, buf, buflen, &nwritten); + stream->intern->print_ntotal += nwritten; + return rc; } -#endif /* HAVE_FOPENCOOKIE || HAVE_FUNOPEN */ /* The core of our printf function. This is called in locked state. */ @@ -1701,98 +1692,13 @@ static int es_print (estream_t ES__RESTRICT stream, const char *ES__RESTRICT format, va_list ap) { -#if defined(HAVE_FOPENCOOKIE) || defined(HAVE_FUNOPEN) - - if (!stream->intern->print_fp) - { -#ifdef HAVE_FOPENCOOKIE - { - cookie_io_functions_t io = { NULL }; - io.write = print_fun_writer; - - stream->intern->print_fp = fopencookie (stream, "w", io); - } -#else /*!HAVE_FOPENCOOKIE*/ - stream->intern->print_fp = funopen (stream, NULL, - print_fun_writer, NULL, NULL); -#endif /*!HAVE_FOPENCOOKIE*/ - if (!stream->intern->print_fp) - return -1; - } + int rc; - stream->intern->print_err = 0; - stream->intern->print_errno = 0; stream->intern->print_ntotal = 0; - - if ( vfprintf (stream->intern->print_fp, format, ap) < 0 - || fflush (stream->intern->print_fp) ) - { - stream->intern->print_errno = errno; - stream->intern->print_err = 1; - fclose (stream->intern->print_fp); - stream->intern->print_fp = NULL; - } - if (stream->intern->print_err) - { - errno = stream->intern->print_errno; - return -1; - } - + rc = estream_format (print_writer, stream, format, ap); + if (rc) + return -1; return (int)stream->intern->print_ntotal; - -#else /* No funopen or fopencookie. */ - - char data[BUFFER_BLOCK_SIZE]; - size_t bytes_read; - size_t bytes_written; - FILE *tmp_stream; - int err; - - bytes_written = 0; - tmp_stream = NULL; - err = 0; - - tmp_stream = tmpfile (); - if (! tmp_stream) - { - err = errno; - goto out; - } - - err = vfprintf (tmp_stream, format, ap); - if (err < 0) - goto out; - - err = fseek (tmp_stream, 0, SEEK_SET); - if (err) - goto out; - - while (1) - { - bytes_read = fread (data, 1, sizeof (data), tmp_stream); - if (ferror (tmp_stream)) - { - err = -1; - break; - } - - err = es_writen (stream, data, bytes_read, NULL); - if (err) - break; - else - bytes_written += bytes_read; - if (feof (tmp_stream)) - break; - } - if (err) - goto out; - - out: - if (tmp_stream) - fclose (tmp_stream); - - return err ? -1 : bytes_written; -#endif /* no funopen or fopencookie */ } @@ -2718,7 +2624,7 @@ es_vfprintf (estream_t ES__RESTRICT stream, const char *ES__RESTRICT format, static int es_fprintf_unlocked (estream_t ES__RESTRICT stream, - const char *ES__RESTRICT format, ...) + const char *ES__RESTRICT format, ...) { int ret; @@ -2868,8 +2774,6 @@ es_opaque_get (estream_t stream) return opaque; } - - /* Print a BUFFER to STREAM while replacing all control characters and the characters in DELIMITERS by standard C escape sequences. Returns 0 on success or -1 on error. If BYTES_WRITTEN is not NULL @@ -2992,7 +2896,7 @@ es_write_hexstring (estream_t ES__RESTRICT stream, encoding. The interface is the same as es_write_sanitized, however only one delimiter may be supported. - THIS IS NOT A STANDARD ESTREAM FUNCTION AND ONLY USED BY GNUPG. */ + THIS IS NOT A STANDARD ESTREAM FUNCTION AND ONLY USED BY GNUPG!. */ int es_write_sanitized_utf8_buffer (estream_t stream, const void *buffer, size_t length, @@ -3025,6 +2929,3 @@ es_write_sanitized_utf8_buffer (estream_t stream, return es_write_sanitized (stream, p, length, delimiters, bytes_written); } #endif /*GNUPG_MAJOR_VERSION*/ - - - |