From 24543a36668c9a446faf63d7cc8ff9e54c9805a5 Mon Sep 17 00:00:00 2001 From: Michal Bloch Date: Mon, 29 Jan 2018 11:26:35 +0100 Subject: [PATCH] shared: add a way to receive control msg reply Change-Id: Ice96f49aaf8982c73747c05e351a16abcabec15e Signed-off-by: Michal Bloch --- include/logcommon.h | 1 + src/shared/logcommon.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/include/logcommon.h b/include/logcommon.h index 9e01e4a..1598dc7 100644 --- a/include/logcommon.h +++ b/include/logcommon.h @@ -60,6 +60,7 @@ log_priority log_priority_from_char(char c); void syslog_critical_failure(const char * message); int send_dlog_request(int sockfd, int request, void *data, int datalen); int send_dlog_reply(int sockfd, int request, int result, void *data, int datalen); +int recv_dlog_reply(int sockfd, int request, void **data, int *datalen); int send_pipe(int sockfd, int pipefd); int recv_pipe(int sockfd); int connect_sock(const char *path); diff --git a/src/shared/logcommon.c b/src/shared/logcommon.c index ab91b27..c4b64dd 100644 --- a/src/shared/logcommon.c +++ b/src/shared/logcommon.c @@ -225,6 +225,55 @@ static int __send_dlog_msg(int sockfd, int result, int request, void *data, int return (writev(sockfd, iov, data ? 2 : 1) < 0) ? -errno : 0; } +/** + * @brief Receive dlog protocol reply + * @param[in] sockfd Socket file descriptor to read from + * @param[in] request The expected request type + * @param[out] data Pointer to extra data from the message + * @param[out] datalen Length of the extra data + * @notes If data is not NULL, it has to be deallocated manually after use. + * @return 0 on success, -errno on failure + */ +int recv_dlog_reply(int sockfd, int request, void **data, int *datalen) +{ + assert(sockfd >= 0); + assert(data); + assert(datalen); + + *data = NULL; + + struct dlog_control_msg header; + int r = read(sockfd, &header, sizeof header); + if (r < 0) + return -errno; + if (r < sizeof header) + return -EINVAL; + if (header.request != (request | DLOG_REQ_REPLY) + || header.result != DLOG_REQ_RESULT_OK) + return -EINVAL; + + *datalen = header.length - sizeof header; + if (*datalen < 0) + return -EINVAL; + if (*datalen == 0) { + *data = NULL; + return 0; + } + + *data = malloc(*datalen); + if (!*data) + return -ENOMEM; + + r = read(sockfd, *data, *datalen); + if (r < *datalen) { + free(*data); + *data = NULL; + return r < 0 ? -errno : -EINVAL; + } + + return 0; +} + int send_dlog_request(int sockfd, int request, void *data, int datalen) { return __send_dlog_msg(sockfd, 0, request, data, datalen); @@ -232,7 +281,7 @@ int send_dlog_request(int sockfd, int request, void *data, int datalen) int send_dlog_reply(int sockfd, int request, int result, void *data, int datalen) { - return __send_dlog_msg(sockfd, result, DLOG_REQ_REPLY | request, NULL, 0); + return __send_dlog_msg(sockfd, result, DLOG_REQ_REPLY | request, data, datalen); } /** -- 2.7.4