/* Received response message from broker. * Look up the sender uuid in clients hash and deliver. * Responses for disconnected clients are silently discarded. */ static void response_cb (flux_t h, flux_msg_watcher_t *w, const flux_msg_t *msg, void *arg) { ctx_t *ctx = arg; char *uuid = NULL; client_t *c; flux_msg_t *cpy = flux_msg_copy (msg, true); if (!cpy) oom (); if (flux_msg_pop_route (cpy, &uuid) < 0) goto done; if (flux_msg_clear_route (cpy) < 0) goto done; c = zlist_first (ctx->clients); while (c) { if (!strcmp (uuid, zuuid_str (c->uuid))) { if (client_send_nocopy (c, &cpy) < 0) { /* FIXME handle errors */ flux_log (h, LOG_ERR, "%s: client_send %s: %s", __FUNCTION__, zuuid_str (c->uuid), strerror (errno)); errno = 0; } break; } c = zlist_next (ctx->clients); } if (uuid) free (uuid); done: flux_msg_destroy (cpy); }
flux_msg_t *module_recvmsg (module_t *p) { flux_msg_t *msg = NULL; int type; assert (p->magic == MODULE_MAGIC); if (!(msg = flux_msg_recvzsock (p->sock))) goto error; if (flux_msg_get_type (msg, &type) == 0 && type == FLUX_MSGTYPE_RESPONSE) { if (flux_msg_pop_route (msg, NULL) < 0) /* simulate DEALER socket */ goto error; } return msg; error: flux_msg_destroy (msg); return NULL; }
int module_sendmsg (module_t *p, const flux_msg_t *msg) { flux_msg_t *cpy = NULL; int type; int rc = -1; if (!msg) return 0; if (flux_msg_get_type (msg, &type) < 0) goto done; switch (type) { case FLUX_MSGTYPE_REQUEST: { /* simulate DEALER socket */ char uuid[16]; snprintf (uuid, sizeof (uuid), "%u", p->rank); if (!(cpy = flux_msg_copy (msg, true))) goto done; if (flux_msg_push_route (cpy, uuid) < 0) goto done; if (flux_msg_sendzsock (p->sock, cpy) < 0) goto done; break; } case FLUX_MSGTYPE_RESPONSE: { /* simulate ROUTER socket */ if (!(cpy = flux_msg_copy (msg, true))) goto done; if (flux_msg_pop_route (cpy, NULL) < 0) goto done; if (flux_msg_sendzsock (p->sock, cpy) < 0) goto done; break; } default: if (flux_msg_sendzsock (p->sock, msg) < 0) goto done; break; } rc = 0; done: flux_msg_destroy (cpy); return rc; }