static client_t *create_client(server_t *s, mrp_transport_t *lt) { mrp_transport_t *t; client_t *c; c = mrp_allocz(sizeof(*c)); if (c != NULL) { mrp_list_init(&c->hook); c->s = s; c->id = s->next_id++; c->t = mrp_transport_accept(lt, c, MRP_TRANSPORT_REUSEADDR); if (c->t != NULL) { mrp_list_append(&s->clients, &c->hook); return c; } mrp_free(c); } else { t = mrp_transport_accept(lt, NULL, MRP_TRANSPORT_REUSEADDR); mrp_transport_destroy(t); } return NULL; }
static void destroy_client(client_t *c) { mrp_list_delete(&c->hook); mrp_transport_destroy(c->t); client_destroy(c->c); mrp_free(c); }
static mrp_transport_t *create_transport(pdp_t *pdp, const char *address) { static mrp_transport_evt_t msg_evt, wrt_evt; mrp_transport_evt_t *e; mrp_transport_t *t; mrp_sockaddr_t addr; socklen_t alen; int flags; const char *type; t = NULL; alen = mrp_transport_resolve(NULL, address, &addr, sizeof(addr), &type); if (alen <= 0) { mrp_log_error("Failed to resolve transport address '%s'.", address); return NULL; } flags = MRP_TRANSPORT_REUSEADDR; if (strncmp(address, "wsck", 4) != 0) { e = &msg_evt; e->connection = msg_connect_cb; e->closed = msg_closed_cb; e->recvmsg = msg_recv_cb; e->recvmsgfrom = NULL; } else { e = &wrt_evt; e->connection = wrt_connect_cb; e->closed = wrt_closed_cb; e->recvcustom = wrt_recv_cb; e->recvcustomfrom = NULL; flags |= MRP_TRANSPORT_MODE_CUSTOM; } t = mrp_transport_create(pdp->ctx->ml, type, e, pdp, flags); if (t != NULL) { if (mrp_transport_bind(t, &addr, alen) && mrp_transport_listen(t, 4)) return t; else { mrp_log_error("Failed to bind to transport address '%s'.", address); mrp_transport_destroy(t); } } else mrp_log_error("Failed to create transport '%s'.", address); return NULL; }
static void destroy_transport(mrp_transport_t *t) { mrp_transport_destroy(t); }