#ifndef OIO_H #define OIO_H #include /* size_t */ typedef int oio_err; /* FIXME */ typedef struct oio_req_s oio_req; typedef struct oio_handle_s oio_handle; typedef void (*oio_read_cb)(oio_req* req, size_t nread); typedef void (*oio_write_cb)(oio_req* req); typedef void (*oio_accept_cb)(oio_handle* handle); typedef void (*oio_close_cb)(oio_handle* handle, oio_err e); typedef void (*oio_connect_cb)(oio_req* req, oio_err e); typedef void (*oio_shutdown_cb)(oio_req* req); #if defined(__unix__) || defined(__POSIX__) || defined(__APPLE__) # include "oio-unix.h" #else # include "oio-win.h" #endif typedef enum { OIO_UNKNOWN_HANDLE = 0, OIO_TCP, OIO_NAMED_PIPE, OIO_TTY, OIO_FILE, } oio_handle_type; typedef enum { OIO_UNKNOWN_REQ = 0, OIO_CONNECT, OIO_ACCEPT, OIO_READ, OIO_WRITE, OIO_SHUTDOWN, OIO_CLOSE } oio_req_type; struct oio_handle_s { /* read-only */ oio_handle_type type; /* public */ oio_close_cb close_cb; void* data; /* private */ struct oio_handle_private_s; }; typedef struct oio_req_s { /* read-only */ oio_req_type type; /* public */ oio_handle* handle; void* cb; void* data; /* private */ struct oio_req_private_s; } oio_req; /** * Most functions return boolean: 0 for success and -1 for failure. * On error the user should then call oio_last_error() to determine * the error code. */ oio_err oio_last_error(); const char* oio_err_str(oio_err err); void oio_init(); int oio_run(); void oio_req_init(oio_req* req, oio_handle* handle, void* cb); /* * TODO: * - oio_(pipe|pipe_tty)_handle_init * - oio_bind_pipe(char *name) * - oio_continuous_read(oio_handle *handle, oio_continuous_read_cb *cb) * - A way to list cancelled oio_reqs after before/on oio_close_cb */ /* TCP socket methods. */ /* Handle and callback bust be set by calling oio_req_init. */ int oio_tcp_handle_init(oio_handle *handle, oio_close_cb close_cb, void* data); int oio_bind(oio_handle* handle, struct sockaddr* addr); int oio_connect(oio_req* req, struct sockaddr* addr); int oio_shutdown(oio_req* req); /* TCP server methods. */ int oio_listen(oio_handle* handle, int backlog, oio_accept_cb cb); int oio_tcp_handle_accept(oio_handle* server, oio_handle* client, oio_close_cb close_cb, void* data); /* Generic handle methods */ int oio_read(oio_req* req, oio_buf* bufs, int bufcnt); int oio_write(oio_req* req, oio_buf* bufs, int bufcnt); int oio_write2(oio_req *req, const char* msg); /* Request handle to be closed. close_cb will be called */ /* asynchronously after this call. */ int oio_close(oio_handle* handle); /* Utility */ struct sockaddr_in oio_ip4_addr(char* ip, int port); #endif /* OIO_H */