Blame docs/code/uvcat/main.c

Packit b5b901
#include <assert.h>
Packit b5b901
#include <stdio.h>
Packit b5b901
#include <fcntl.h>
Packit b5b901
#include <unistd.h>
Packit b5b901
#include <uv.h>
Packit b5b901
Packit b5b901
void on_read(uv_fs_t *req);
Packit b5b901
Packit b5b901
uv_fs_t open_req;
Packit b5b901
uv_fs_t read_req;
Packit b5b901
uv_fs_t write_req;
Packit b5b901
Packit b5b901
static char buffer[1024];
Packit b5b901
Packit b5b901
static uv_buf_t iov;
Packit b5b901
Packit b5b901
void on_write(uv_fs_t *req) {
Packit b5b901
    if (req->result < 0) {
Packit b5b901
        fprintf(stderr, "Write error: %s\n", uv_strerror((int)req->result));
Packit b5b901
    }
Packit b5b901
    else {
Packit b5b901
        uv_fs_read(uv_default_loop(), &read_req, open_req.result, &iov, 1, -1, on_read);
Packit b5b901
    }
Packit b5b901
}
Packit b5b901
Packit b5b901
void on_read(uv_fs_t *req) {
Packit b5b901
    if (req->result < 0) {
Packit b5b901
        fprintf(stderr, "Read error: %s\n", uv_strerror(req->result));
Packit b5b901
    }
Packit b5b901
    else if (req->result == 0) {
Packit b5b901
        uv_fs_t close_req;
Packit b5b901
        // synchronous
Packit b5b901
        uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
Packit b5b901
    }
Packit b5b901
    else if (req->result > 0) {
Packit b5b901
        iov.len = req->result;
Packit b5b901
        uv_fs_write(uv_default_loop(), &write_req, 1, &iov, 1, -1, on_write);
Packit b5b901
    }
Packit b5b901
}
Packit b5b901
Packit b5b901
void on_open(uv_fs_t *req) {
Packit b5b901
    // The request passed to the callback is the same as the one the call setup
Packit b5b901
    // function was passed.
Packit b5b901
    assert(req == &open_req);
Packit b5b901
    if (req->result >= 0) {
Packit b5b901
        iov = uv_buf_init(buffer, sizeof(buffer));
Packit b5b901
        uv_fs_read(uv_default_loop(), &read_req, req->result,
Packit b5b901
                   &iov, 1, -1, on_read);
Packit b5b901
    }
Packit b5b901
    else {
Packit b5b901
        fprintf(stderr, "error opening file: %s\n", uv_strerror((int)req->result));
Packit b5b901
    }
Packit b5b901
}
Packit b5b901
Packit b5b901
int main(int argc, char **argv) {
Packit b5b901
    uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
Packit b5b901
    uv_run(uv_default_loop(), UV_RUN_DEFAULT);
Packit b5b901
Packit b5b901
    uv_fs_req_cleanup(&open_req);
Packit b5b901
    uv_fs_req_cleanup(&read_req);
Packit b5b901
    uv_fs_req_cleanup(&write_req);
Packit b5b901
    return 0;
Packit b5b901
}