enum {
IO_CONNECTED = 0,
IO_TLSREADY,
IO_DATAIN,
IO_LOWAT,
IO_DISCONNECTED,
IO_TIMEOUT,
IO_ERROR,
};
#define IO_IN 0x01
#define IO_OUT 0x02
struct io;
struct tls;
void io_set_nonblocking(int);
void io_set_nolinger(int);
struct io *io_new(void);
void io_free(struct io *);
void io_set_read(struct io *);
void io_set_write(struct io *);
void io_set_fd(struct io *, int);
void io_set_callback(struct io *io, void(*)(struct io *, int, void *), void *);
void io_set_timeout(struct io *, int);
void io_set_lowat(struct io *, size_t);
void io_pause(struct io *, int);
void io_resume(struct io *, int);
void io_reload(struct io *);
int io_connect(struct io *, const struct sockaddr *, const struct sockaddr *);
int io_connect_tls(struct io *, struct tls *, const char *);
int io_accept_tls(struct io *, struct tls *);
const char* io_strio(struct io *);
const char* io_strevent(int);
const char* io_error(struct io *);
struct tls* io_tls(struct io *);
int io_fileno(struct io *);
int io_paused(struct io *, int);
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 *, ...)
__attribute__((__format__ (printf, 2, 3)));
int io_vprintf(struct io *, const char *, va_list)
__attribute__((__format__ (printf, 2, 0)));
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);