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