From cc6ac1475faf04c3577b947188f353bb56d16c71 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Tue, 26 Jan 2016 16:57:54 +1100 Subject: [PATCH] Allow binary data of user defined length to be sent via a send_unix function --- src/libckpool.c | 40 ++++++++++++++++++++++++---------------- src/libckpool.h | 3 +++ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/libckpool.c b/src/libckpool.c index 07e1f0dd..93261c1a 100644 --- a/src/libckpool.c +++ b/src/libckpool.c @@ -1093,56 +1093,64 @@ int _write_length(int sockd, const void *buf, int len, const char *file, const c return ofs; } -bool _send_unix_msg(int sockd, const char *buf, int timeout, const char *file, const char *func, const int line) +bool _send_unix(int sockd, const char *buf, uint32_t len, int timeout, const char *file, + const char *func, const int line) { - uint32_t msglen, len; bool retval = false; + uint32_t msglen; int ret, ern; if (unlikely(sockd < 0)) { LOGWARNING("Attempting to send unix message to invalidated sockd %d", sockd); goto out; } - if (unlikely(!buf)) { - LOGWARNING("Null message sent to send_unix_msg"); - goto out; - } - len = strlen(buf); - if (unlikely(!len)) { - LOGWARNING("Zero length message sent to send_unix_msg"); - goto out; - } msglen = htole32(len); ret = wait_write_select(sockd, timeout); if (unlikely(ret < 1)) { ern = errno; - LOGERR("Select1 failed in send_unix_msg (%d)", ern); + LOGERR("Select1 failed in send_unix (%d)", ern); goto out; } ret = _write_length(sockd, &msglen, 4, file, func, line); if (unlikely(ret < 4)) { - LOGERR("Failed to write 4 byte length in send_unix_msg"); + LOGERR("Failed to write 4 byte length in send_unix"); goto out; } ret = wait_write_select(sockd, timeout); if (unlikely(ret < 1)) { ern = errno; - LOGERR("Select2 failed in send_unix_msg (%d)", ern); + LOGERR("Select2 failed in send_unix (%d)", ern); goto out; } ret = _write_length(sockd, buf, len, file, func, line); if (unlikely(ret < 0)) { - LOGERR("Failed to write %d bytes in send_unix_msg", len); + LOGERR("Failed to write %d bytes in send_unix", len); goto out; } retval = true; out: shutdown(sockd, SHUT_WR); if (unlikely(!retval)) - LOGERR("Failure in send_unix_msg from %s %s:%d", file, func, line); + LOGERR("Failure in send_unix from %s %s:%d", file, func, line); return retval; } +bool _send_unix_msg(int sockd, const char *buf, int timeout, const char *file, const char *func, const int line) +{ + uint32_t len; + + if (unlikely(!buf)) { + LOGWARNING("Null message sent to send_unix_msg"); + return NULL; + } + len = strlen(buf); + if (unlikely(!len)) { + LOGWARNING("Zero length message sent to send_unix_msg"); + return NULL; + } + return _send_unix(sockd, buf, len, timeout, file, func, line); +} + bool _send_unix_data(int sockd, const struct msghdr *msg, const char *file, const char *func, const int line) { bool retval = false; diff --git a/src/libckpool.h b/src/libckpool.h index 58a1b5b7..65ba9fb1 100644 --- a/src/libckpool.h +++ b/src/libckpool.h @@ -529,6 +529,9 @@ char *_recv_unix_msg(int sockd, int timeout1, int timeout2, const char *file, co int wait_write_select(int sockd, float timeout); #define write_length(sockd, buf, len) _write_length(sockd, buf, len, __FILE__, __func__, __LINE__) int _write_length(int sockd, const void *buf, int len, const char *file, const char *func, const int line); +bool _send_unix(int sockd, const char *buf, uint32_t len, int timeout, const char *file, + const char *func, const int line); +#define send_unix(sockd, buf, len) _send_unix(sockd, buf, len, UNIX_WRITE_TIMEOUT, __FILE__, __func__, __LINE__) bool _send_unix_msg(int sockd, const char *buf, int timeout, const char *file, const char *func, const int line); #define send_unix_msg(sockd, buf) _send_unix_msg(sockd, buf, UNIX_WRITE_TIMEOUT, __FILE__, __func__, __LINE__) bool _send_unix_data(int sockd, const struct msghdr *msg, const char *file, const char *func, const int line);