#include #include #include #include #ifndef CONNECTION_H #define CONNECTION_H struct connection; typedef bool (*c_init) (struct connection *conn, void *args); typedef ssize_t (*c_send) (struct connection *conn, void *buff, size_t len); typedef bool (*c_dial) (struct connection *conn); typedef bool (*c_listen) (struct connection *conn); typedef ssize_t (*c_recv) (struct connection *conn, void *buff, size_t len); typedef bool (*c_destroy) (struct connection *conn, void *args); enum CONNECTION_TYPE { CONN_T_TCP=0, CONN_T_UDP, CONN_T_UNIX, CONN_T_TELNET, CONN_T_NUM_KNOWN_TYPES }; enum CONNECTION_ROLE { CONN_R_LISTEN=0, CONN_R_DIAL }; struct connection { uint8_t c_t; c_init init_fn; void *init_args; c_dial dial_fn; c_listen listen_fn; c_send send_fn; c_recv recv_fn; c_destroy destroy_fn; void *destroy_args; //stores connection specific info void *ctx; }; bool connection_init(struct connection *conn, enum CONNECTION_TYPE c_t, char *init_args); bool connection_destroy(struct connection *conn); //In case we want to deal with with a connection we don't know how to handle bool connection_init_with_params(struct connection *conn, uint8_t c_t, c_init cinit, void *c_init_args, c_destroy cdestroy, void *c_destroy_args, c_dial cdial, c_listen clisten, c_send csend, c_recv crecv); bool connection_dial(struct connection *conn); bool connection_listen(struct connection *conn); ssize_t connection_send(struct connection *conn, void *buff, size_t num_bytes); ssize_t connection_recv(struct connection *conn, void *buff, size_t num_bytes); #endif