From e86ea976715e3c9bc521b93019976a75daf2d2c6 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Sun, 28 Feb 2016 13:08:04 -0800 Subject: [PATCH] --file-{read,write,append} --- adsbus/adsbus.c | 18 ++++++++++++++++++ adsbus/opts.c | 38 ++++++++++++++++++++++++++++++++++++++ adsbus/opts.h | 3 +++ adsbus/send.c | 1 + 4 files changed, 60 insertions(+) diff --git a/adsbus/adsbus.c b/adsbus/adsbus.c index 7357a60..822400e 100644 --- a/adsbus/adsbus.c +++ b/adsbus/adsbus.c @@ -32,6 +32,9 @@ static void print_usage(const char *name) { "\t--connect-send=FORMAT=HOST/PORT\n" "\t--listen-receive=[HOST/]PORT\n" "\t--listen-send=FORMAT=[HOST/]PORT\n" + "\t--file-read=PATH\n" + "\t--file-write=FORMAT=PATH\n" + "\t--file-append=FORMAT=PATH\n" "\t--stdin\n" "\t--stdout=FORMAT\n" , name); @@ -45,6 +48,9 @@ static bool parse_opts(int argc, char *argv[]) { {"connect-send", required_argument, 0, 's'}, {"listen-receive", required_argument, 0, 'l'}, {"listen-send", required_argument, 0, 'm'}, + {"file-read", required_argument, 0, 'r'}, + {"file-write", required_argument, 0, 'w'}, + {"file-append", required_argument, 0, 'a'}, {"stdin", no_argument, 0, 'i'}, {"stdout", required_argument, 0, 'o'}, {"help", no_argument, 0, 'h'}, @@ -71,6 +77,18 @@ static bool parse_opts(int argc, char *argv[]) { handler = opts_add_listen_send; break; + case 'r': + handler = opts_add_file_read; + break; + + case 'w': + handler = opts_add_file_write; + break; + + case 'a': + handler = opts_add_file_append; + break; + case 'i': handler = opts_add_stdin; break; diff --git a/adsbus/opts.c b/adsbus/opts.c index e805809..bef8bd2 100644 --- a/adsbus/opts.c +++ b/adsbus/opts.c @@ -1,5 +1,8 @@ +#include #include #include +#include +#include #include #include "buf.h" @@ -88,6 +91,41 @@ bool opts_add_listen_send(char *arg) { return true; } +bool opts_add_file_read(char *arg) { + int fd = open(arg, O_RDONLY | O_CLOEXEC); + if (fd == -1) { + return false; + } + receive_new(fd, NULL, NULL); + return true; +} + +bool opts_add_file_write(char *arg) { + struct serializer *serializer = opts_get_serializer(&arg); + if (!serializer) { + return NULL; + } + + int fd = open(arg, O_WRONLY | O_CREAT | O_NOFOLLOW | O_TRUNC | O_CLOEXEC, S_IRWXU); + if (fd == -1) { + return false; + } + return send_new_hello(fd, serializer, NULL); +} + +bool opts_add_file_append(char *arg) { + struct serializer *serializer = opts_get_serializer(&arg); + if (!serializer) { + return NULL; + } + + int fd = open(arg, O_WRONLY | O_CREAT | O_NOFOLLOW | O_CLOEXEC, S_IRWXU); + if (fd == -1) { + return false; + } + return send_new_hello(fd, serializer, NULL); +} + bool opts_add_stdin(char __attribute__((unused)) *arg) { receive_new(dup(0), NULL, NULL); return true; diff --git a/adsbus/opts.h b/adsbus/opts.h index b1f4c42..b27161d 100644 --- a/adsbus/opts.h +++ b/adsbus/opts.h @@ -6,5 +6,8 @@ bool opts_add_connect_receive(char *); bool opts_add_connect_send(char *); bool opts_add_listen_receive(char *); bool opts_add_listen_send(char *); +bool opts_add_file_read(char *); +bool opts_add_file_write(char *); +bool opts_add_file_append(char *); bool opts_add_stdout(char *); bool opts_add_stdin(char *); diff --git a/adsbus/send.c b/adsbus/send.c index 073c7e4..43221d4 100644 --- a/adsbus/send.c +++ b/adsbus/send.c @@ -141,6 +141,7 @@ bool send_new_hello(int fd, struct serializer *serializer, struct peer *on_close send_hello(&buf_ptr, serializer); if (buf_ptr->length) { if (write(fd, buf_at(buf_ptr, 0), buf_ptr->length) != (ssize_t) buf_ptr->length) { + assert(!close(fd)); return false; } }