diff options
| author | Marcus Brinkmann <[email protected]> | 2009-10-20 15:39:15 +0000 | 
|---|---|---|
| committer | Marcus Brinkmann <[email protected]> | 2009-10-20 15:39:15 +0000 | 
| commit | e782b1ab06a2d3325bc487c28ab678c95d9675b3 (patch) | |
| tree | 87aacb82e59e4d7d8b60d2c55d66b12eed01af2e /assuan/assuan-inquire.c | |
| parent | Add new debug helper (diff) | |
| download | gpgme-e782b1ab06a2d3325bc487c28ab678c95d9675b3.tar.gz gpgme-e782b1ab06a2d3325bc487c28ab678c95d9675b3.zip | |
2009-10-20  Marcus Brinkmann  <[email protected]>
	* configure.ac: Replace internal libassuan by external libassuan.
	* m4/libassuan.m4: New file.
	* Makefile.am (assuan): Remove variable.
	(SUBDIRS): Remove ${assuan}.
	* assuan/: Removed.
src/
2009-10-20  Marcus Brinkmann  <[email protected]>
	* Makefile.am (assuan_cppflags, assuan_libobjs): Removed.
	(gpgsm_components): Move engine-assuan.c to ...
	(assuan_components): ... this new variable.
	(main_sources): Add this new variable.
	(AM_CPPFLAGS): Remove $(assuan_cppflags).
	(AM_CFLAGS): Add @LIBASSUAN_CFLAGS@.
	(libgpgme_la_DEPENDENCIES, libgpgme_pth_la_DEPENDENCIES)
	(libgpgme_glib_la_DEPENDENCIES, libgpgme_qt_la_DEPENDENCIES)
	(libgpgme_pthread_la_DEPENDENCIES): Remove $(assuan_libobjs).
	(libgpgme_la_LIBADD, libgpgme_pth_la_LIBADD)
	(libgpgme_glib_la_LIBADD, libgpgme_qt_la_LIBADD))
	(libgpgme_pthread_la_LIBADD): Replace $(assuan_libobjs) by
	@LIBASSUAN_LIBS@.
	* priv-io.h [!HAVE_W32_SYSTEM]: Declare _gpgme_io_recvmsg,
	_gpgme_io_sendmsg, _gpgme_io_waitpid.
	* engine-backend.h: Define with [ENABLE_ASSUAN] instead
	of [ENABLE_GPGSM].
	* posix-io.c (_gpgme_io_waitpid): Make non-static.
	* util.h (ENABLE_ASSUAN): Declar _gpgme_assuan_system_hooks,
	_gpgme_assuan_malloc_hooks, _gpgme_assuan_log_cb.
	* engine-gpgsm.c: Don't map assuan error codes.  Use
	assuan_release instead of assuan_disconnect.
	(map_assuan_error): Remove function.
	(gpgsm_new): Use new assuan context interface.
	* engine-assuan.c: Use assuan_release instead of
	assuan_disconnect.
	(llass_new): Use new assuan context interface.
Diffstat (limited to '')
| -rw-r--r-- | assuan/assuan-inquire.c | 385 | 
1 files changed, 0 insertions, 385 deletions
| diff --git a/assuan/assuan-inquire.c b/assuan/assuan-inquire.c deleted file mode 100644 index ab710a12..00000000 --- a/assuan/assuan-inquire.c +++ /dev/null @@ -1,385 +0,0 @@ -/* assuan-inquire.c - handle inquire stuff - * Copyright (C) 2001, 2002, 2003, 2005, 2007 Free Software Foundation, Inc. - * - * This file is part of Assuan. - * - * Assuan is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2.1 of - * the License, or (at your option) any later version. - * - * Assuan 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. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include <config.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include "assuan-defs.h" - -#define digitp(a) ((a) >= '0' && (a) <= '9') -#define xtoi_1(p)   (*(p) <= '9'? (*(p)- '0'): \ -                     *(p) <= 'F'? (*(p)-'A'+10):(*(p)-'a'+10)) -#define xtoi_2(p)   ((xtoi_1(p) * 16) + xtoi_1((p)+1)) - - -struct membuf -{ -  size_t len; -  size_t size; -  char *buf; -  int out_of_core; -  int too_large; -  size_t maxlen; -}; - - - -/* A simple implementation of a dynamic buffer.  Use init_membuf() to -   create a buffer, put_membuf to append bytes and get_membuf to -   release and return the buffer.  Allocation errors are detected but -   only returned at the final get_membuf(), this helps not to clutter -   the code with out of core checks.  */ - -static void -init_membuf (struct membuf *mb, int initiallen, size_t maxlen) -{ -  mb->len = 0; -  mb->size = initiallen; -  mb->out_of_core = 0; -  mb->too_large = 0; -  mb->maxlen = maxlen; -  /* we need to allocate one byte more for get_membuf */ -  mb->buf = xtrymalloc (initiallen+1); -  if (!mb->buf) -      mb->out_of_core = 1; -} - -static void -put_membuf (struct membuf *mb, const void *buf, size_t len) -{ -  if (mb->out_of_core || mb->too_large) -    return; - -  if (mb->maxlen && mb->len + len > mb->maxlen) -    { -      mb->too_large = 1; -      return; -    } - -  if (mb->len + len >= mb->size) -    { -      char *p; -       -      mb->size += len + 1024; -      /* we need to allocate one byte more for get_membuf */ -      p = xtryrealloc (mb->buf, mb->size+1); -      if (!p) -        { -          mb->out_of_core = 1; -          return; -        } -      mb->buf = p; -    } -  memcpy (mb->buf + mb->len, buf, len); -  mb->len += len; -} - -static void * -get_membuf (struct membuf *mb, size_t *len) -{ -  char *p; - -  if (mb->out_of_core || mb->too_large) -    { -      xfree (mb->buf); -      mb->buf = NULL; -      return NULL; -    } - -  mb->buf[mb->len] = 0; /* there is enough space for the hidden eos */ -  p = mb->buf; -  *len = mb->len; -  mb->buf = NULL; -  mb->out_of_core = 1; /* don't allow a reuse */ -  return p; -} - -static void -free_membuf (struct membuf *mb) -{ -  xfree (mb->buf); -  mb->buf = NULL; -} - - -/** - * assuan_inquire: - * @ctx: An assuan context - * @keyword: The keyword used for the inquire - * @r_buffer: Returns an allocated buffer - * @r_length: Returns the length of this buffer - * @maxlen: If not 0, the size limit of the inquired data. - *  - * A Server may use this to Send an inquire.  r_buffer, r_length and - * maxlen may all be NULL/0 to indicate that no real data is expected. - *  - * Return value: 0 on success or an ASSUAN error code - **/ -assuan_error_t -assuan_inquire (assuan_context_t ctx, const char *keyword, -                unsigned char **r_buffer, size_t *r_length, size_t maxlen) -{ -  assuan_error_t rc; -  struct membuf mb; -  char cmdbuf[LINELENGTH-10]; /* (10 = strlen ("INQUIRE ")+CR,LF) */ -  unsigned char *line, *p; -  int linelen; -  int nodataexpected; - -  if (!ctx || !keyword || (10 + strlen (keyword) >= sizeof (cmdbuf))) -    return _assuan_error (ASSUAN_Invalid_Value); -  nodataexpected = !r_buffer && !r_length && !maxlen; -  if (!nodataexpected && (!r_buffer || !r_length)) -    return _assuan_error (ASSUAN_Invalid_Value); -  if (!ctx->is_server) -    return _assuan_error (ASSUAN_Not_A_Server); -  if (ctx->in_inquire) -    return _assuan_error (ASSUAN_Nested_Commands); -   -  ctx->in_inquire = 1; -  if (nodataexpected) -    memset (&mb, 0, sizeof mb); /* avoid compiler warnings */ -  else -    init_membuf (&mb, maxlen? maxlen:1024, maxlen); - -  strcpy (stpcpy (cmdbuf, "INQUIRE "), keyword); -  rc = assuan_write_line (ctx, cmdbuf); -  if (rc) -    goto leave; - -  for (;;) -    { -      do  -        { -	  rc = _assuan_read_line (ctx); -          if (rc) -            goto leave; -          line = (unsigned char *) ctx->inbound.line; -          linelen = ctx->inbound.linelen; -        }     -      while (*line == '#' || !linelen); -      if (line[0] == 'E' && line[1] == 'N' && line[2] == 'D' -          && (!line[3] || line[3] == ' ')) -        break; /* END command received*/ -      if (line[0] == 'C' && line[1] == 'A' && line[2] == 'N') -        { -          rc = _assuan_error (ASSUAN_Canceled); -          goto leave; -        } -      if (line[0] != 'D' || line[1] != ' ' || nodataexpected) -        { -          rc = _assuan_error (ASSUAN_Unexpected_Command); -          goto leave; -        } -      if (linelen < 3) -        continue; -      line += 2; -      linelen -= 2; - -      p = line; -      while (linelen) -        { -          for (;linelen && *p != '%'; linelen--, p++) -            ; -          put_membuf (&mb, line, p-line); -          if (linelen > 2) -            { /* handle escaping */ -              unsigned char tmp[1]; -              p++; -              *tmp = xtoi_2 (p); -              p += 2; -              linelen -= 3; -              put_membuf (&mb, tmp, 1); -            } -          line = p; -        } -      if (mb.too_large) -        { -          rc = _assuan_error (ASSUAN_Too_Much_Data); -          goto leave; -        } -    } - -  if (!nodataexpected) -    { -      *r_buffer = get_membuf (&mb, r_length); -      if (!*r_buffer) -        rc = _assuan_error (ASSUAN_Out_Of_Core); -    } - - leave: -  if (!nodataexpected) -    free_membuf (&mb); -  ctx->in_inquire = 0; -  return rc; -} - - -void -_assuan_inquire_release (assuan_context_t ctx) -{ -  if (ctx->in_inquire) -    { -      if (ctx->inquire_membuf) -	{ -	  free_membuf (ctx->inquire_membuf); -	  free (ctx->inquire_membuf); -	} -      ctx->in_inquire = 0; -    } -} - - -int -_assuan_inquire_ext_cb (assuan_context_t ctx) -{ -  int rc; -  unsigned char *line; -  int linelen; -  struct membuf *mb; -  unsigned char *p; - -  line = (unsigned char *) ctx->inbound.line; -  linelen = ctx->inbound.linelen; -  mb = ctx->inquire_membuf; - -  if (line[0] == 'C' && line[1] == 'A' && line[2] == 'N') -    { -      rc = _assuan_error (ASSUAN_Canceled); -      goto leave; -    } -  if (line[0] == 'E' && line[1] == 'N' && line[2] == 'D' -      && (!line[3] || line[3] == ' ')) -    { -      rc = 0; -      goto leave; -    } - -  if (line[0] != 'D' || line[1] != ' ' || mb == NULL) -    { -      rc = _assuan_error (ASSUAN_Unexpected_Command); -      goto leave; -    } -   -  if (linelen < 3) -    return 0; -  line += 2; -  linelen -= 2; -   -  p = line; -  while (linelen) -    { -      for (;linelen && *p != '%'; linelen--, p++) -	; -      put_membuf (mb, line, p-line); -      if (linelen > 2) -	{ /* handle escaping */ -	  unsigned char tmp[1]; -	  p++; -	  *tmp = xtoi_2 (p); -	  p += 2; -	  linelen -= 3; -	  put_membuf (mb, tmp, 1); -	} -      line = p; -    } -  if (mb->too_large) -    { -      rc = _assuan_error (ASSUAN_Too_Much_Data); -      goto leave; -    } - -  return 0; - - leave: -  { -    size_t buf_len = 0; -    unsigned char *buf = NULL; - -    if (mb) -      { -	buf = get_membuf (mb, &buf_len); -	if (!buf) -	  rc = _assuan_error (ASSUAN_Out_Of_Core); -	free_membuf (mb); -	free (mb); -	ctx->inquire_membuf = NULL; -      } -    ctx->in_inquire = 0; -    rc = (ctx->inquire_cb) (ctx->inquire_cb_data, rc, buf, buf_len); -  } -  return rc; -} - -/** - * assuan_inquire_ext: - * @ctx: An assuan context - * @keyword: The keyword used for the inquire - * @maxlen: If not 0, the size limit of the inquired data. - * @cb: A callback handler which is invoked after the operation completed. - * @cb_data: A user-provided value passed to the callback handler. - *  - * A Server may use this to Send an inquire.  r_buffer, r_length and - * maxlen may all be NULL/0 to indicate that no real data is expected. - * When this function returns,  - * - * Return value: 0 on success or an ASSUAN error code - **/ -assuan_error_t -assuan_inquire_ext (assuan_context_t ctx, const char *keyword, size_t maxlen, -		    int (*cb) (void *cb_data, int rc, unsigned char *buf, -			       size_t len), -		    void *cb_data) -{ -  assuan_error_t rc; -  struct membuf *mb = NULL; -  char cmdbuf[LINELENGTH-10]; /* (10 = strlen ("INQUIRE ")+CR,LF) */ - -  if (!ctx || !keyword || (10 + strlen (keyword) >= sizeof (cmdbuf))) -    return _assuan_error (ASSUAN_Invalid_Value); -  if (!ctx->is_server) -    return _assuan_error (ASSUAN_Not_A_Server); -  if (ctx->in_inquire) -    return _assuan_error (ASSUAN_Nested_Commands); - -  mb = malloc (sizeof (struct membuf)); -  if (!mb) -    return _assuan_error (ASSUAN_Out_Of_Core); -  init_membuf (mb, maxlen ? maxlen : 1024, maxlen); - -  strcpy (stpcpy (cmdbuf, "INQUIRE "), keyword); -  rc = assuan_write_line (ctx, cmdbuf); -  if (rc) -    { -      free_membuf (mb);  -      free (mb); -      return rc; -    } - -  ctx->in_inquire = 1; - -  /* Set up the continuation.  */ -  ctx->inquire_cb = cb; -  ctx->inquire_cb_data = cb_data; -  ctx->inquire_membuf = mb; - -  return 0; -} | 
