From 2c7fbecc890a13fa0b3b7a0528154dfd0529f978 Mon Sep 17 00:00:00 2001 From: Fei Li Date: Fri, 8 Apr 2022 15:07:59 +0800 Subject: [PATCH] misc: life_mngr: fix a bug about receiving message On some extreme circumstances, the client can't send the whole message out in a short time. In this case, the server can't receive the whole message because now server didn't check the integrity of the message. This patch add this by checking the terminal character of the message. Tracked-On: #7215 Signed-off-by: Fei Li --- misc/services/life_mngr/uart.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/misc/services/life_mngr/uart.c b/misc/services/life_mngr/uart.c index 48afe17a9..a49525f53 100644 --- a/misc/services/life_mngr/uart.c +++ b/misc/services/life_mngr/uart.c @@ -24,6 +24,7 @@ static ssize_t try_receive_message_by_uart(int fd, void *buffer, size_t buf_len) { ssize_t rc = 0U, count = 0U; char *tmp; + unsigned int retry_times = RETRY_RECV_TIMES; do { /* NOTE: Now we can't handle multi command message at one time. */ @@ -37,8 +38,15 @@ static ssize_t try_receive_message_by_uart(int fd, void *buffer, size_t buf_len) tmp[count - 1] = '\0'; break; } + } else { + if (errno == EAGAIN) { + usleep(WAIT_RECV); + retry_times--; + } else { + break; + } } - } while (rc > 0U); + } while (retry_times != 0U); return count; } @@ -48,17 +56,10 @@ static ssize_t try_receive_message_by_uart(int fd, void *buffer, size_t buf_len) */ ssize_t receive_message_by_uart(struct uart_dev *dev, void *buf, size_t len) { - ssize_t count = 0; - unsigned int retry_times = RETRY_RECV_TIMES; - if ((dev == NULL) || (buf == NULL) || (len == 0)) return -EINVAL; - do { - usleep(WAIT_RECV); - count = try_receive_message_by_uart(dev->tty_fd, buf, len); - retry_times--; - } while ((count == 0) && (retry_times != 0U)); - return count; + + return try_receive_message_by_uart(dev->tty_fd, buf, len); } ssize_t send_message_by_uart(struct uart_dev *dev, const void *buf, size_t len) { @@ -66,7 +67,7 @@ ssize_t send_message_by_uart(struct uart_dev *dev, const void *buf, size_t len) if ((dev == NULL) || (buf == NULL) || (len == 0)) return -EINVAL; - ret = write(dev->tty_fd, buf, len); + ret = write(dev->tty_fd, buf, len + 1); return ret; }