#include #include #include #include #include static void handle_err(ECPConnection *conn, unsigned char mtype, int err) { printf("ERR: CTYPE:0x%x MTYPE:0x%x ERR:%d\n", conn->type, mtype, err); } static ECPConnection *conn_new(ECPSocket *sock, ECPConnection *parent, unsigned char type) { ECPConnection *conn = NULL; switch (type) { #ifdef ECP_WITH_HTABLE case ECP_CTYPE_VCONN: { ECPVConnInb *_conn; _conn = malloc(sizeof(ECPVConnInb)); if (_conn) { ecp_vconn_init_inb(_conn, sock); conn = &_conn->b; } break; } #endif case ECP_CTYPE_VLINK: { conn = malloc(sizeof(ECPConnection)); if (conn) ecp_vlink_init(conn, sock); break; } default: { conn = malloc(sizeof(ECPConnection)); if (conn) ecp_conn_init(conn, sock, type); break; } } if (conn) ecp_conn_set_flags(conn, ECP_CONN_FLAG_GC); return conn; } static void conn_free(ECPConnection *conn) { /* outbound connections are statically allocated */ if (ecp_conn_is_inb(conn)) free(conn); } int ecp_init(ECPContext *ctx, ECPConnHandler *vconn_handler, ECPConnHandler *vlink_handler) { int rv; rv = ecp_ctx_init(ctx, handle_err, conn_new, conn_free, NULL); if (rv) return rv; rv = ecp_vconn_handler_init(ctx, vconn_handler); if (rv) return rv; rv = ecp_vlink_handler_init(ctx, vlink_handler); if (rv) return rv; return ECP_OK; }