@@ -1269,18 +1269,21 @@ jsonrpc_session_send(struct jsonrpc_session *s, struct jsonrpc_msg *msg)
}
}
-struct jsonrpc_msg *
-jsonrpc_session_recv_until(struct jsonrpc_session *s, long long deadline)
+int
+jsonrpc_session_recv_until(struct jsonrpc_session *s,
+ struct jsonrpc_msg **full_msg,
+ long long deadline)
{
if (s->rpc) {
unsigned int received_bytes;
struct jsonrpc_msg *msg;
+ int ret;
received_bytes = jsonrpc_get_received_bytes(s->rpc);
if (deadline) {
- jsonrpc_recv_until(s->rpc, &msg, deadline);
+ ret = jsonrpc_recv_until(s->rpc, &msg, deadline);
} else {
- jsonrpc_recv(s->rpc, &msg);
+ ret = jsonrpc_recv(s->rpc, &msg);
}
long long int now = time_msec();
@@ -1306,18 +1309,23 @@ jsonrpc_session_recv_until(struct jsonrpc_session *s, long long deadline)
&& !strcmp(msg->id->string, "echo")) {
/* It's a reply to our echo request. Suppress it. */
} else {
- return msg;
+ *full_msg = msg;
+ return 0;
}
jsonrpc_msg_destroy(msg);
+ } else {
+ return ret;
}
}
- return NULL;
+ return 0;
}
struct jsonrpc_msg *
jsonrpc_session_recv(struct jsonrpc_session *s)
{
- return jsonrpc_session_recv_until(s, 0);
+ struct jsonrpc_msg *msg = NULL;
+ jsonrpc_session_recv_until(s, &msg, 0);
+ return msg;
}
void
@@ -126,8 +126,8 @@ size_t jsonrpc_session_get_n_remotes(const struct jsonrpc_session *);
int jsonrpc_session_send(struct jsonrpc_session *, struct jsonrpc_msg *);
struct jsonrpc_msg *jsonrpc_session_recv(struct jsonrpc_session *);
-struct jsonrpc_msg *jsonrpc_session_recv_until(struct jsonrpc_session *,
- long long);
+int jsonrpc_session_recv_until(struct jsonrpc_session *, struct jsonrpc_msg **,
+ long long);
void jsonrpc_session_recv_wait(struct jsonrpc_session *);
bool jsonrpc_session_is_alive(const struct jsonrpc_session *);
Refactor jsonrpc_session_recv_until() to return the results of the jsonrpc_recv()/jsonrpc_recv_until() calls, making it possible to detect blocking calls (EAGAIN) in upper layers. Signed-off-by: Martin Morgenstern <martin.morgenstern@cloudandheat.com> --- lib/jsonrpc.c | 22 +++++++++++++++------- lib/jsonrpc.h | 4 ++-- 2 files changed, 17 insertions(+), 9 deletions(-)