summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Brinkmann <mb@g10code.com>2007-10-05 16:44:08 +0000
committerMarcus Brinkmann <mb@g10code.com>2007-10-05 16:44:08 +0000
commitd0395d1de508b960fa8d7c83e404d7aacb617c9c (patch)
treef22047c0e0076ccdbb0299cc60f702c8b1861582
parent5ba735fa2dfafc8f7c2141137b4bf5799d05a9b9 (diff)
downloadlibassuan-d0395d1de508b960fa8d7c83e404d7aacb617c9c.tar.gz
2007-10-05 Marcus Brinkmann <marcus@g10code.de>
* assuan-defs.h (_assuan_error_is_eagain): New prototype. * mkerrors (_assuan_error_is_eagain): New function. * assuan-handler.c (process_next): Leave on EAGAIN. * assuan-handler.c (process_request), assuan-client.c (_assuan_read_from_server), assuan-buffer.c (assuan_read_line): Busy loop over EAGAIN.
-rw-r--r--src/ChangeLog9
-rw-r--r--src/assuan-buffer.c9
-rw-r--r--src/assuan-client.c6
-rw-r--r--src/assuan-defs.h2
-rw-r--r--src/assuan-handler.c8
-rwxr-xr-xsrc/mkerrors13
6 files changed, 43 insertions, 4 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 53fd37a..ea2a89d 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
+2007-10-05 Marcus Brinkmann <marcus@g10code.de>
+
+ * assuan-defs.h (_assuan_error_is_eagain): New prototype.
+ * mkerrors (_assuan_error_is_eagain): New function.
+ * assuan-handler.c (process_next): Leave on EAGAIN.
+ * assuan-handler.c (process_request),
+ assuan-client.c (_assuan_read_from_server),
+ assuan-buffer.c (assuan_read_line): Busy loop over EAGAIN.
+
2007-10-05 Werner Koch <wk@g10code.com>
* assuan-socket.c (_assuan_sock_wsa2errno): Map WSANOTINITIALISED.
diff --git a/src/assuan-buffer.c b/src/assuan-buffer.c
index 2016864..3968584 100644
--- a/src/assuan-buffer.c
+++ b/src/assuan-buffer.c
@@ -93,7 +93,7 @@ readline (assuan_context_t ctx, char *buf, size_t buflen,
}
-/* Function returns an Assuan error. */
+/* Function returns an Assuan error. */
assuan_error_t
_assuan_read_line (assuan_context_t ctx)
{
@@ -245,7 +245,12 @@ assuan_read_line (assuan_context_t ctx, char **line, size_t *linelen)
if (!ctx)
return _assuan_error (ASSUAN_Invalid_Value);
- err = _assuan_read_line (ctx);
+ do
+ {
+ err = _assuan_read_line (ctx);
+ }
+ while (_assuan_error_is_eagain (err));
+
*line = ctx->inbound.line;
*linelen = ctx->inbound.linelen;
return err;
diff --git a/src/assuan-client.c b/src/assuan-client.c
index 090e7fc..15f4f1c 100644
--- a/src/assuan-client.c
+++ b/src/assuan-client.c
@@ -42,7 +42,11 @@ _assuan_read_from_server (assuan_context_t ctx, int *okay, int *off)
*off = 0;
do
{
- rc = _assuan_read_line (ctx);
+ do
+ {
+ rc = _assuan_read_line (ctx);
+ }
+ while (_assuan_error_is_eagain (rc));
if (rc)
return rc;
line = ctx->inbound.line;
diff --git a/src/assuan-defs.h b/src/assuan-defs.h
index 1e31c43..f17e906 100644
--- a/src/assuan-defs.h
+++ b/src/assuan-defs.h
@@ -234,6 +234,8 @@ void _assuan_inquire_release (assuan_context_t ctx);
/* Map error codes as used in this implementation to the libgpg-error
codes. */
assuan_error_t _assuan_error (int oldcode);
+/* Check if ERR means EAGAIN. */
+int _assuan_error_is_eagain (assuan_error_t err);
/* Extract the error code from A. This works for both the old and the
new style error codes. This needs to be used whenever an error
diff --git a/src/assuan-handler.c b/src/assuan-handler.c
index 4c02608..0b9700e 100644
--- a/src/assuan-handler.c
+++ b/src/assuan-handler.c
@@ -612,6 +612,8 @@ process_next (assuan_context_t ctx)
required to write full lines without blocking long after starting
a partial line. */
rc = _assuan_read_line (ctx);
+ if (_assuan_error_is_eagain (rc))
+ return 0;
if (rc)
return rc;
if (*ctx->inbound.line == '#' || !ctx->inbound.linelen)
@@ -683,7 +685,11 @@ process_request (assuan_context_t ctx)
if (ctx->in_inquire)
return _assuan_error (ASSUAN_Nested_Commands);
- rc = _assuan_read_line (ctx);
+ do
+ {
+ rc = _assuan_read_line (ctx);
+ }
+ while (_assuan_error_is_eagain (rc));
if (rc)
return rc;
if (*ctx->inbound.line == '#' || !ctx->inbound.linelen)
diff --git a/src/mkerrors b/src/mkerrors
index feded4f..33a9284 100755
--- a/src/mkerrors
+++ b/src/mkerrors
@@ -141,6 +141,19 @@ _assuan_error (int oldcode)
}
+/* A small helper function to treat EAGAIN transparently to the
+ caller. */
+int
+_assuan_error_is_eagain (assuan_error_t err)
+{
+ if ((!err_source && err == ASSUAN_Read_Error && errno == EAGAIN)
+ || (err_source && (err & ((1 << 24) - 1)) == (6 | (1 << 15))))
+ return 1;
+ else
+ return 0;
+}
+
+
/**
* assuan_strerror:
* @err: Error code