Blame docs/code/uvcat/main.c

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