Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 30 additions & 5 deletions src/mq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -279,6 +281,31 @@ 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 {
buffer = buffer + (size_t)messageWrittenBytes;
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;
Expand All @@ -302,8 +329,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));
Expand Down Expand Up @@ -349,8 +375,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;
Expand Down