From 96926327e00ef95f25b10b6f1b54c57a29a6603e Mon Sep 17 00:00:00 2001 From: Andrew Martin Date: Mon, 8 Aug 2022 17:45:54 -0400 Subject: [PATCH 1/2] Support output without delimiter. Calling write in loop when outputing and check for errors. --- src/mq.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/mq.c b/src/mq.c index a5e5b8b..8f0b9c5 100644 --- a/src/mq.c +++ b/src/mq.c @@ -24,6 +24,7 @@ static char doc[] = "Delimiters:\n" " n new line (LF) [default]\n" " z zero (NUL)\n" + " x no delimiter\n" "\n" "\n" "Examples:\n" @@ -147,8 +148,9 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) case 'd': if (0 == strcmp("n", arg)) args->delimiter = '\n'; else if (0 == strcmp("z", arg)) args->delimiter = '\0'; + else if (0 == strcmp("x", arg)) args->delimiter = 'x'; else { - LOG_ERR("Invalid delimiter speicifer '%s' (use 'n' or 'z')", arg); + LOG_ERR("Invalid delimiter speicifer '%s' (use 'n' or 'z' or 'x')", arg); return ARGP_ERR_UNKNOWN; } break; @@ -279,6 +281,30 @@ static mqd_t mqu_open_ro(const struct arguments *args) return queue; } +// Precondition: sz is greater than zero. +static void write_msg_with_delimiter(const struct arguments *args, uint8_t *buffer, size_t sz) { + size_t messageRemainingBytes = sz; + do { + ssize_t messageWrittenBytes = write(1, buffer, messageRemainingBytes); + if(messageWrittenBytes == -1) { + LOG_ERR("mq_receive error writing message: %s", strerror(errno)); + exit(1); + } else { + messageRemainingBytes = messageRemainingBytes - (size_t)messageWrittenBytes; + } + } while (messageRemainingBytes > 0); + if(args->delimiter != 'x') { + ssize_t delimiterWrittenBytes = write(1, &args->delimiter, 1); + if(delimiterWrittenBytes == -1) { + LOG_ERR("mq_receive error writing delimiter: %s", strerror(errno)); + exit(1); + } else if(delimiterWrittenBytes != 1) { + fprintf(stderr, "mq_receive error: Expected single byte to be written\n"); + exit(1); + } + } +} + static int cmd_recv(const struct arguments *args) { mqd_t queue; @@ -302,8 +328,7 @@ static int cmd_recv(const struct arguments *args) if (n >= 0) { /* got a message */ LOG_VERBOSE_HEXA(args, buffer, n); - write(1, buffer, n); - write(1, &args->delimiter, 1); + write_msg_with_delimiter(args,buffer,(size_t)n); ret = 0; } else { LOG_ERR("mq_receive error: %s", strerror(errno)); @@ -349,8 +374,7 @@ static int cmd_recv_follow(const struct arguments *args) if (n >= 0) { /* got a message */ LOG_VERBOSE_HEXA(args, buffer, n); - write(1, buffer, n); - write(1, &args->delimiter, 1); /* delimiter */ + write_msg_with_delimiter(args,buffer,(size_t)n); } else { LOG_ERR("mq_receive error: %s", strerror(errno)); break; From d5940cdc0401a57b07bc8b56f9ee9e0e0e972b8e Mon Sep 17 00:00:00 2001 From: Andrew Martin Date: Wed, 10 Aug 2022 13:35:30 -0400 Subject: [PATCH 2/2] Advance pointer into buffer --- src/mq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/mq.c b/src/mq.c index 8f0b9c5..0dc1566 100644 --- a/src/mq.c +++ b/src/mq.c @@ -290,6 +290,7 @@ static void write_msg_with_delimiter(const struct arguments *args, uint8_t *buff LOG_ERR("mq_receive error writing message: %s", strerror(errno)); exit(1); } else { + buffer = buffer + (size_t)messageWrittenBytes; messageRemainingBytes = messageRemainingBytes - (size_t)messageWrittenBytes; } } while (messageRemainingBytes > 0);