summaryrefslogtreecommitdiff
path: root/src/assuan-io.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2007-10-08 18:03:38 +0000
committerWerner Koch <wk@gnupg.org>2007-10-08 18:03:38 +0000
commit9d7b9bac2855ed9ce91b36ca7d6b26032aa72dd6 (patch)
treedc5b5e14ffcea4bf0610e708d05c62167396c677 /src/assuan-io.c
parent52bd1cdff856f9477a19734f935bbaa126dedc7a (diff)
downloadlibassuan-9d7b9bac2855ed9ce91b36ca7d6b26032aa72dd6.tar.gz
Add assuan_set_io_hooks.
Diffstat (limited to 'src/assuan-io.c')
-rw-r--r--src/assuan-io.c51
1 files changed, 44 insertions, 7 deletions
diff --git a/src/assuan-io.c b/src/assuan-io.c
index eb50f7a..1ff4ecb 100644
--- a/src/assuan-io.c
+++ b/src/assuan-io.c
@@ -1,5 +1,5 @@
/* assuan-io.c - Wraps the read and write functions.
- * Copyright (C) 2002, 2004, 2006 Free Software Foundation, Inc.
+ * Copyright (C) 2002, 2004, 2006, 2007 Free Software Foundation, Inc.
*
* This file is part of Assuan.
*
@@ -46,8 +46,8 @@ _assuan_waitpid (pid_t pid, int *status, int options)
#endif
-ssize_t
-_assuan_io_read (assuan_fd_t fd, void *buffer, size_t size)
+static ssize_t
+do_io_read (assuan_fd_t fd, void *buffer, size_t size)
{
#ifdef HAVE_W32_SYSTEM
/* Due to the peculiarities of the W32 API we can't use read for a
@@ -92,14 +92,34 @@ _assuan_io_read (assuan_fd_t fd, void *buffer, size_t size)
ssize_t
+_assuan_io_read (assuan_fd_t fd, void *buffer, size_t size)
+{
+ ssize_t retval;
+
+ if (_assuan_io_hooks.read_hook
+ && _assuan_io_hooks.read_hook (NULL, fd, buffer, size, &retval) == 1)
+ return retval;
+
+ return do_io_read (fd, buffer, size);
+}
+
+ssize_t
_assuan_simple_read (assuan_context_t ctx, void *buffer, size_t size)
{
- return _assuan_io_read (ctx->inbound.fd, buffer, size);
+ ssize_t retval;
+
+ if (_assuan_io_hooks.read_hook
+ && _assuan_io_hooks.read_hook (ctx, ctx->inbound.fd,
+ buffer, size, &retval) == 1)
+ return retval;
+
+ return do_io_read (ctx->inbound.fd, buffer, size);
}
-ssize_t
-_assuan_io_write (assuan_fd_t fd, const void *buffer, size_t size)
+
+static ssize_t
+do_io_write (assuan_fd_t fd, const void *buffer, size_t size)
{
#ifdef HAVE_W32_SYSTEM
/* Due to the peculiarities of the W32 API we can't use write for a
@@ -132,11 +152,28 @@ _assuan_io_write (assuan_fd_t fd, const void *buffer, size_t size)
#endif /*!HAVE_W32_SYSTEM*/
}
+ssize_t
+_assuan_io_write (assuan_fd_t fd, const void *buffer, size_t size)
+{
+ ssize_t retval;
+
+ if (_assuan_io_hooks.write_hook
+ && _assuan_io_hooks.write_hook (NULL, fd, buffer, size, &retval) == 1)
+ return retval;
+ return do_io_write (fd, buffer, size);
+}
ssize_t
_assuan_simple_write (assuan_context_t ctx, const void *buffer, size_t size)
{
- return _assuan_io_write (ctx->outbound.fd, buffer, size);
+ ssize_t retval;
+
+ if (_assuan_io_hooks.write_hook
+ && _assuan_io_hooks.write_hook (ctx, ctx->outbound.fd,
+ buffer, size, &retval) == 1)
+ return retval;
+
+ return do_io_write (ctx->outbound.fd, buffer, size);
}