From d183fc0952acbb2b3d3146c1ad4f8b8f74e84cfc Mon Sep 17 00:00:00 2001 From: Love Hornquist Astrand Date: Sun, 22 Nov 2009 13:14:34 -0800 Subject: [PATCH] handle sync unix socket message, turn async message into sync if the backend doesn't support them --- lib/ipc/client.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/lib/ipc/client.c b/lib/ipc/client.c index 500d27815..b7d116f22 100644 --- a/lib/ipc/client.c +++ b/lib/ipc/client.c @@ -375,13 +375,29 @@ unix_socket_init(const char *service, return ret; } - static int unix_socket_ipc(void *ctx, - const heim_idata *request, heim_idata *response, + const heim_idata *req, heim_idata *rep, heim_icred *cred) { - return EINVAL; + struct path_ctx *s = ctx; + uint32_t len = htonl(req->length); + if (net_write(s->fd, &len, sizeof(len)) != sizeof(len)) + return -1; + if (net_write(s->fd, req->data, req->length) != req->length) + return -1; + + if (net_read(s->fd, &len, sizeof(len)) != sizeof(len)) + return -1; + + rep->length = ntohl(len); + rep->data = malloc(rep->length); + if (rep->data == NULL) + return -1; + if (net_read(s->fd, rep->data, rep->length) != rep->length) + return -1; + + return 0; } int @@ -527,7 +543,15 @@ int heim_ipc_async(heim_ipc ctx, const heim_idata *send, void *userctx, void (*func)(void *, int, heim_idata *, heim_icred)) { - if (ctx->ops->async == NULL) - return EAGAIN; /* XXX */ + if (ctx->ops->async == NULL) { + heim_idata recv; + heim_icred cred; + int ret; + + ret = (ctx->ops->ipc)(ctx->ctx, send, &recv, &cred); + (*func)(userctx, ret, &recv, cred); + heim_ipc_free_cred(cred); + free(recv.data); + } return (ctx->ops->async)(ctx->ctx, send, userctx, func); }