diff --git a/src/ckpmsg.c b/src/ckpmsg.c index 9129a43c..b51eb85b 100644 --- a/src/ckpmsg.c +++ b/src/ckpmsg.c @@ -19,9 +19,11 @@ int main(int argc, char **argv) { char *name = NULL, *socket_dir = NULL, *buf = NULL; bool proxy = false; + int tmo1 = RECV_UNIX_TIMEOUT1; + int tmo2 = RECV_UNIX_TIMEOUT2; int c; - while ((c = getopt(argc, argv, "n:s:p")) != -1) { + while ((c = getopt(argc, argv, "n:s:pt:T:")) != -1) { switch(c) { case 'n': name = strdup(optarg); @@ -32,6 +34,12 @@ int main(int argc, char **argv) case 'p': proxy = true; break; + case 't': + tmo1 = atoi(optarg); + break; + case 'T': + tmo2 = atoi(optarg); + break; } } if (!socket_dir) @@ -76,7 +84,7 @@ int main(int argc, char **argv) break; } dealloc(buf); - buf = recv_unix_msg(sockd); + buf = recv_unix_msg_tmo2(sockd, tmo1, tmo2); close(sockd); if (!buf) { LOGERR("Received empty message"); diff --git a/src/libckpool.c b/src/libckpool.c index dab6799e..8fb55173 100644 --- a/src/libckpool.c +++ b/src/libckpool.c @@ -739,13 +739,13 @@ int read_length(int sockd, void *buf, int len) /* Use a standard message across the unix sockets: * 4 byte length of message as little endian encoded uint32_t followed by the * string. Return NULL in case of failure. */ -char *_recv_unix_msg(int sockd, const char *file, const char *func, const int line) +char *_recv_unix_msg(int sockd, int timeout1, int timeout2, const char *file, const char *func, const int line) { char *buf = NULL; uint32_t msglen; int ret; - ret = wait_read_select(sockd, 30); + ret = wait_read_select(sockd, timeout1); if (unlikely(ret < 1)) { LOGERR("Select1 failed in recv_unix_msg"); goto out; @@ -761,7 +761,7 @@ char *_recv_unix_msg(int sockd, const char *file, const char *func, const int li LOGWARNING("Invalid message length %u sent to recv_unix_msg", msglen); goto out; } - ret = wait_read_select(sockd, 5); + ret = wait_read_select(sockd, timeout2); if (unlikely(ret < 1)) { LOGERR("Select2 failed in recv_unix_msg"); goto out; diff --git a/src/libckpool.h b/src/libckpool.h index b01967e5..93323d9c 100644 --- a/src/libckpool.h +++ b/src/libckpool.h @@ -441,8 +441,12 @@ int _open_unix_client(const char *server_path, const char *file, const char *fun #define open_unix_client(server_path) _open_unix_client(server_path, __FILE__, __func__, __LINE__) int wait_read_select(int sockd, int timeout); int read_length(int sockd, void *buf, int len); -char *_recv_unix_msg(int sockd, const char *file, const char *func, const int line); -#define recv_unix_msg(sockd) _recv_unix_msg(sockd, __FILE__, __func__, __LINE__) +char *_recv_unix_msg(int sockd, int timeout1, int timeout2, const char *file, const char *func, const int line); +#define RECV_UNIX_TIMEOUT1 30 +#define RECV_UNIX_TIMEOUT2 5 +#define recv_unix_msg(sockd) _recv_unix_msg(sockd, RECV_UNIX_TIMEOUT1, RECV_UNIX_TIMEOUT2, __FILE__, __func__, __LINE__) +#define recv_unix_msg_tmo(sockd, tmo) _recv_unix_msg(sockd, tmo, RECV_UNIX_TIMEOUT2, __FILE__, __func__, __LINE__) +#define recv_unix_msg_tmo2(sockd, tmo1, tmo2) _recv_unix_msg(sockd, tmo1, tmo2, __FILE__, __func__, __LINE__) 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);