Browse Source

Provide a way to send binary data over unix sockets

master
Con Kolivas 11 years ago
parent
commit
6c4abba93c
  1. 39
      src/libckpool.c
  2. 2
      src/libckpool.h

39
src/libckpool.c

@ -722,6 +722,45 @@ int write_length(int sockd, const void *buf, int len)
return ofs;
}
bool _send_unix_data(int sockd, void *buf, uint32_t len, const char *file, const char *func, const int line)
{
bool retval = false;
uint32_t msglen;
int ret;
if (unlikely(!buf)) {
LOGWARNING("Null message sent to send_unix_msg");
goto out;
}
msglen = htole32(len);
ret = wait_write_select(sockd, 5);
if (unlikely(ret < 1)) {
LOGERR("Select1 failed in send_unix_msg");
goto out;
}
ret = write_length(sockd, &msglen, 4);
if (unlikely(ret < 4)) {
LOGERR("Failed to write 4 byte length in send_unix_msg");
goto out;
}
ret = wait_write_select(sockd, 5);
if (unlikely(ret < 1)) {
LOGERR("Select2 failed in send_unix_msg");
goto out;
}
ret = write_length(sockd, buf, len);
if (unlikely(ret < 0)) {
LOGERR("Failed to write %d bytes in send_unix_msg", len);
goto out;
}
retval = true;
out:
if (unlikely(!retval))
LOGERR("Failure in send_unix_msg from %s %s:%d", file, func, line);
return retval;
}
bool _send_unix_msg(int sockd, const char *buf, const char *file, const char *func, const int line)
{
uint32_t msglen, len;

2
src/libckpool.h

@ -344,6 +344,8 @@ int wait_write_select(int sockd, int timeout);
int write_length(int sockd, const void *buf, int len);
bool _send_unix_msg(int sockd, const char *buf, const char *file, const char *func, const int line);
#define send_unix_msg(sockd, buf) _send_unix_msg(sockd, buf, __FILE__, __func__, __LINE__)
bool _send_unix_data(int sockd, void *buf, uint32_t len, const char *file, const char *func, const int line);
#define send_unix_data(sockd, buf, len) _send_unix_data(sockd, buf, len, __FILE__, __func__, __LINE__)
const char *__json_array_string(json_t *val, unsigned int entry);
char *json_array_string(json_t *val, unsigned int entry);

Loading…
Cancel
Save