#include <event.h>
enum {
IO_CONNECTED = 0,
IO_TLSREADY,
IO_DATAIN,
IO_LOWAT,
IO_CLOSED,
IO_DISCONNECTED,
IO_TIMEOUT,
IO_ERROR,
IO_TLSERROR,
};
#define IO_IN 0x1
#define IO_OUT 0x2
struct io;
void io_trace(int);
const char* io_strio(struct io *);
const char* io_strevent(int);
struct io *io_new(void);
void io_free(struct io *);
int io_set_callback(struct io *, void(*)(struct io *, int, void *), void *);
int io_set_bindaddr(struct io *, const struct sockaddr *);
int io_set_bufsize(struct io *, size_t);
void io_set_timeout(struct io *, int);
void io_set_lowat(struct io *, size_t);
const char *io_error(struct io *);
int io_fileno(struct io *);
int io_attach(struct io *io, int);
int io_detach(struct io *io);
int io_close(struct io *io);
int io_connect(struct io *, struct addrinfo *);
int io_disconnect(struct io *io);
int io_starttls(struct io *, void *);
void io_pause(struct io *, int);
void io_resume(struct io *, int);
void io_set_read(struct io *);
void io_set_write(struct io *);
int io_write(struct io *, const void *, size_t);
int io_writev(struct io *, const struct iovec *, int);
int io_print(struct io *, const char *);
int io_printf(struct io *, const char *, ...);
int io_vprintf(struct io *, const char *, va_list);
size_t io_queued(struct io *);
void * io_data(struct io *);
size_t io_datalen(struct io *);
char * io_getline(struct io *, size_t *);
void io_drop(struct io *, size_t);