aboutsummaryrefslogtreecommitdiff
path: root/docs/code/uvcat/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'docs/code/uvcat/main.c')
-rw-r--r--docs/code/uvcat/main.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/docs/code/uvcat/main.c b/docs/code/uvcat/main.c
new file mode 100644
index 00000000..b03b0944
--- /dev/null
+++ b/docs/code/uvcat/main.c
@@ -0,0 +1,63 @@
+#include <assert.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <uv.h>
+
+void on_read(uv_fs_t *req);
+
+uv_fs_t open_req;
+uv_fs_t read_req;
+uv_fs_t write_req;
+
+static char buffer[1024];
+
+static uv_buf_t iov;
+
+void on_write(uv_fs_t *req) {
+ if (req->result < 0) {
+ fprintf(stderr, "Write error: %s\n", uv_strerror((int)req->result));
+ }
+ else {
+ uv_fs_read(uv_default_loop(), &read_req, open_req.result, &iov, 1, -1, on_read);
+ }
+}
+
+void on_read(uv_fs_t *req) {
+ if (req->result < 0) {
+ fprintf(stderr, "Read error: %s\n", uv_strerror(req->result));
+ }
+ else if (req->result == 0) {
+ uv_fs_t close_req;
+ // synchronous
+ uv_fs_close(uv_default_loop(), &close_req, open_req.result, NULL);
+ }
+ else if (req->result > 0) {
+ iov.len = req->result;
+ uv_fs_write(uv_default_loop(), &write_req, 1, &iov, 1, -1, on_write);
+ }
+}
+
+void on_open(uv_fs_t *req) {
+ // The request passed to the callback is the same as the one the call setup
+ // function was passed.
+ assert(req == &open_req);
+ if (req->result >= 0) {
+ iov = uv_buf_init(buffer, sizeof(buffer));
+ uv_fs_read(uv_default_loop(), &read_req, req->result,
+ &iov, 1, -1, on_read);
+ }
+ else {
+ fprintf(stderr, "error opening file: %s\n", uv_strerror((int)req->result));
+ }
+}
+
+int main(int argc, char **argv) {
+ uv_fs_open(uv_default_loop(), &open_req, argv[1], O_RDONLY, 0, on_open);
+ uv_run(uv_default_loop(), UV_RUN_DEFAULT);
+
+ uv_fs_req_cleanup(&open_req);
+ uv_fs_req_cleanup(&read_req);
+ uv_fs_req_cleanup(&write_req);
+ return 0;
+}