diff --git a/common/ChangeLog b/common/ChangeLog index 1657ae0be..4e385e109 100644 --- a/common/ChangeLog +++ b/common/ChangeLog @@ -1,3 +1,15 @@ +2006-09-27 Werner Koch + + * util.h: Do not include strsep.h and strpbrk.h. + (isascii): Removed as it is now in jnlib. + + * iobuf.c (pop_filter, underflow, iobuf_close): Free the unget + buffer. + +2006-09-27 Florian Weimer (wk) + + * iobuf.c (iobuf_unread): New. + 2006-09-22 Werner Koch * i18n.h: Changed license to an all permissive one. diff --git a/common/gpgrlhelp.c b/common/gpgrlhelp.c new file mode 100644 index 000000000..5fbc6731d --- /dev/null +++ b/common/gpgrlhelp.c @@ -0,0 +1,88 @@ +/* gpgrlhelp.c - A readline wrapper. + * Copyright (C) 2006 Free Software Foundation, Inc. + * + * This file is part of GnuPG. + * + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * GnuPG 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + * USA. + */ + +/* This module may by used by applications to initializes readline + support. It is required so that we can have hooks in other parts + of libcommon without actually requing to link against + libreadline. It works along ttyio.c which a proper part of + libcommon. */ + +#include +#include +#include + +#ifdef HAVE_LIBREADLINE +#define GNUPG_LIBREADLINE_H_INCLUDED +#include +#include +#endif + +#include "util.h" +#include "common-defs.h" + + +static void +set_completer (rl_completion_func_t *completer) +{ + rl_attempted_completion_function = completer; + rl_inhibit_completion = 0; +} + +static void +inhibit_completion (int value) +{ + rl_inhibit_completion = value; +} + +static void +cleanup_after_signal (void) +{ + rl_free_line_state (); + rl_cleanup_after_signal (); +} + +static void +init_stream (FILE *fp) +{ + rl_catch_signals = 0; + rl_instream = rl_outstream = fp; + rl_inhibit_completion = 1; +} + + +/* Initialize our readline code. This should be called as early as + possible as it is actually a constructur. */ +void +gnupg_rl_initialize (void) +{ + tty_private_set_rl_hooks (init_stream, + set_completer, + inhibit_completion, + cleanup_after_signal, + readline, + add_history); + rl_readline_name = "GnuPG"; + +} + + + + diff --git a/common/iobuf.c b/common/iobuf.c index 8100883e3..9b13f8b02 100644 --- a/common/iobuf.c +++ b/common/iobuf.c @@ -1037,6 +1037,7 @@ iobuf_close (iobuf_t a) { memset (a->d.buf, 0, a->d.size); /* erase the buffer */ xfree (a->d.buf); + xfree (a->unget.buf); } xfree (a); } @@ -1538,6 +1539,7 @@ pop_filter (iobuf_t a, int (*f) (void *opaque, int control, b = a->chain; assert (b); xfree (a->d.buf); + xfree (a->unget.buf); xfree (a->real_fname); memcpy (a, b, sizeof *a); xfree (b); @@ -1579,6 +1581,7 @@ pop_filter (iobuf_t a, int (*f) (void *opaque, int control, */ b = a->chain; xfree (a->d.buf); + xfree (a->unget.buf); xfree (a->real_fname); memcpy (a, b, sizeof *a); xfree (b); @@ -1621,6 +1624,7 @@ underflow (iobuf_t a) log_debug ("iobuf-%d.%d: pop `%s' in underflow\n", a->no, a->subno, a->desc); xfree (a->d.buf); + xfree (a->unget.buf); xfree (a->real_fname); memcpy (a, b, sizeof *a); xfree (b); @@ -1695,6 +1699,7 @@ underflow (iobuf_t a) log_debug ("iobuf-%d.%d: pop `%s' in underflow (!len)\n", a->no, a->subno, a->desc); xfree (a->d.buf); + xfree (a->unget.buf); xfree (a->real_fname); memcpy (a, b, sizeof *a); xfree (b); @@ -1859,6 +1864,31 @@ iobuf_read (iobuf_t a, void *buffer, unsigned int buflen) } + +/* This is a verly limited unget fucntion for an iobuf. It does only + work in certain cases and should be used with care. */ +void +iobuf_unread (iobuf_t a, const unsigned char *buf, unsigned int buflen) +{ + unsigned int new_len; + + if (!buflen) + return; + + /* We always relocate the buffer, which is not optimal. However, + the code is easier to read this way, and it is not on the fast + path. */ + if ( !a->unget.buf ) + a->unget.size = a->unget.start = a->unget.len = 0; + + new_len = a->unget.len + buflen; + a->unget.buf = xrealloc(a->unget.buf, new_len); + memcpy(a->unget.buf + a->unget.len, buf, buflen); + a->unget.len = new_len; + a->nofast |= 2; +} + + /**************** * Have a look at the iobuf. * NOTE: This only works in special cases. diff --git a/common/iobuf.h b/common/iobuf.h index a3dd7f1c5..55c0b3b6d 100644 --- a/common/iobuf.h +++ b/common/iobuf.h @@ -44,18 +44,21 @@ struct iobuf_struct { int use; /* 1 input , 2 output, 3 temp */ off_t nlimit; - off_t nbytes; /* used together with nlimit */ - off_t ntotal; /* total bytes read (position of stream) */ - int nofast; /* used by the iobuf_get() */ + off_t nbytes; /* Used together with nlimit. */ + off_t ntotal; /* Total bytes read (position of stream). */ + int nofast; /* Used by the iobuf_get (). */ + /* bit 0 (LSB): slow path because of limit. */ + /* bit 1: slow path because of unread. */ void *directfp; struct { - size_t size; /* allocated size */ - size_t start; /* number of invalid bytes at the begin of the buffer */ - size_t len; /* currently filled to this size */ + size_t size; /* Allocated size */ + size_t start; /* Number of invalid bytes at the + begin of the buffer */ + size_t len; /* Currently filled to this size */ byte *buf; - } - d; + } d; + int filter_eof; int error; int (*filter) (void *opaque, int control, @@ -77,8 +80,7 @@ struct iobuf_struct begin of the buffer */ size_t len; /* currently filled to this size */ byte *buf; - } - unget; + } unget; }; #ifndef EXTERN_UNLESS_MAIN_MODULE @@ -124,6 +126,7 @@ int iobuf_seek (iobuf_t a, off_t newpos); int iobuf_readbyte (iobuf_t a); int iobuf_read (iobuf_t a, void *buf, unsigned buflen); +void iobuf_unread (iobuf_t a, const unsigned char *buf, unsigned int buflen); unsigned iobuf_read_line (iobuf_t a, byte ** addr_of_buffer, unsigned *length_of_buffer, unsigned *max_length); int iobuf_peek (iobuf_t a, byte * buf, unsigned buflen); diff --git a/common/util.h b/common/util.h index 86c963cda..8940c9355 100644 --- a/common/util.h +++ b/common/util.h @@ -28,8 +28,6 @@ #include /* We need gpg_error_t. */ /* Common GNUlib includes (-I ../gl/). */ -#include "strpbrk.h" -#include "strsep.h" #include "vasprintf.h" @@ -196,13 +194,6 @@ ttyname (int fd) }; #endif /* !HAVE_TTYNAME */ -#ifndef HAVE_ISASCII -static inline int -isascii (int c) -{ - return (((c) & ~0x7f) == 0); -} -#endif /* !HAVE_ISASCII */ /*-- Macros to replace ctype ones to avoid locale problems. --*/ #define spacep(p) (*(p) == ' ' || *(p) == '\t')