1e66f31c5Sopenharmony_ci#include <assert.h>
2e66f31c5Sopenharmony_ci#include <stdio.h>
3e66f31c5Sopenharmony_ci#include <fcntl.h>
4e66f31c5Sopenharmony_ci#include <uv.h>
5e66f31c5Sopenharmony_ci
6e66f31c5Sopenharmony_civoid on_read(uv_fs_t *req);
7e66f31c5Sopenharmony_ci
8e66f31c5Sopenharmony_ciuv_fs_t open_req;
9e66f31c5Sopenharmony_ciuv_fs_t read_req;
10e66f31c5Sopenharmony_ciuv_fs_t write_req;
11e66f31c5Sopenharmony_ci
12e66f31c5Sopenharmony_cistatic char buffer[1024];
13e66f31c5Sopenharmony_ci
14e66f31c5Sopenharmony_cistatic uv_buf_t iov;
15e66f31c5Sopenharmony_ci
16e66f31c5Sopenharmony_civoid on_write(uv_fs_t *req) {
17e66f31c5Sopenharmony_ci    if (req->result < 0) {
18e66f31c5Sopenharmony_ci        fprintf(stderr, "Write error: %s\n", uv_strerror((int)req->result));
19e66f31c5Sopenharmony_ci    }
20e66f31c5Sopenharmony_ci    else {
21e66f31c5Sopenharmony_ci        uv_fs_read(uv_default_loop(), &read_req, open_req.result, &iov, 1, -1, on_read);
22e66f31c5Sopenharmony_ci    }
23e66f31c5Sopenharmony_ci}
24e66f31c5Sopenharmony_ci
25e66f31c5Sopenharmony_civoid on_read(uv_fs_t *req) {
26e66f31c5Sopenharmony_ci    if (req->result < 0) {
27e66f31c5Sopenharmony_ci        fprintf(stderr, "Read error: %s\n", uv_strerror(req->result));
28e66f31c5Sopenharmony_ci    }
29e66f31c5Sopenharmony_ci    else if (req->result == 0) {
30e66f31c5Sopenharmony_ci        uv_fs_t close_req;
31e66f31c5Sopenharmony_ci        // synchronous
32e66f31c5Sopenharmony_ci        uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
33e66f31c5Sopenharmony_ci    }
34e66f31c5Sopenharmony_ci    else if (req->result > 0) {
35e66f31c5Sopenharmony_ci        iov.len = req->result;
36e66f31c5Sopenharmony_ci        uv_fs_write(uv_default_loop(), &write_req, 1, &iov, 1, -1, on_write);
37e66f31c5Sopenharmony_ci    }
38e66f31c5Sopenharmony_ci}
39e66f31c5Sopenharmony_ci
40e66f31c5Sopenharmony_civoid on_open(uv_fs_t *req) {
41e66f31c5Sopenharmony_ci    // The request passed to the callback is the same as the one the call setup
42e66f31c5Sopenharmony_ci    // function was passed.
43e66f31c5Sopenharmony_ci    assert(req == &open_req);
44e66f31c5Sopenharmony_ci    if (req->result >= 0) {
45e66f31c5Sopenharmony_ci        iov = uv_buf_init(buffer, sizeof(buffer));
46e66f31c5Sopenharmony_ci        uv_fs_read(uv_default_loop(), &read_req, req->result,
47e66f31c5Sopenharmony_ci                   &iov, 1, -1, on_read);
48e66f31c5Sopenharmony_ci    }
49e66f31c5Sopenharmony_ci    else {
50e66f31c5Sopenharmony_ci        fprintf(stderr, "error opening file: %s\n", uv_strerror((int)req->result));
51e66f31c5Sopenharmony_ci    }
52e66f31c5Sopenharmony_ci}
53e66f31c5Sopenharmony_ci
54e66f31c5Sopenharmony_ciint main(int argc, char **argv) {
55e66f31c5Sopenharmony_ci    uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
56e66f31c5Sopenharmony_ci    uv_run(uv_default_loop(), UV_RUN_DEFAULT);
57e66f31c5Sopenharmony_ci
58e66f31c5Sopenharmony_ci    uv_fs_req_cleanup(&open_req);
59e66f31c5Sopenharmony_ci    uv_fs_req_cleanup(&read_req);
60e66f31c5Sopenharmony_ci    uv_fs_req_cleanup(&write_req);
61e66f31c5Sopenharmony_ci    return 0;
62e66f31c5Sopenharmony_ci}
63