#include #include #define BUFFER_SIZE 256 #define log(F,V) printf("%s:%d:%s("F")\n", __FILE__, __LINE__, __func__, V); typedef struct DataRead { char buffer[BUFFER_SIZE]; size_t count; } DataRead; static void on_read (uv_stream_t *stream, ssize_t nread, const uv_buf_t *buffer) { if (nread < 0) { log("error=%s", uv_strerror(nread)); } else { DataRead *data_read = (DataRead *)stream->data; log("nread=%zd", nread); data_read->count += nread; } } static void on_alloc (uv_handle_t *handle, size_t suggested_size, uv_buf_t *buffer) { DataRead *data_read = (DataRead *)handle->data; assert(data_read); buffer->base = data_read->buffer + data_read->count; buffer->len = BUFFER_SIZE - data_read->count; log("provided_size=%ld", buffer->len); } int main(int argc, char const *argv[]) { uv_loop_t loop; uv_tty_t stdin_tty; DataRead data_read; int err; data_read.count = 0; err = uv_loop_init(&loop); assert(err >= 0); err = uv_tty_init(&loop, &stdin_tty, 0, 0); assert(err >= 0); stdin_tty.data = &data_read; /* 'uv_read_start' calls 'on_alloc' before it returns! */ err = uv_read_start((uv_stream_t *)&stdin_tty, on_alloc, on_read); assert(err >= 0); log("%s", "server started!"); err = uv_run(&loop, UV_RUN_DEFAULT); assert(err >= 0); return 0; }