From 421700a7606508bb0eab019f8eed9dc8db46c25e Mon Sep 17 00:00:00 2001 From: Kern Sibbald Date: Wed, 8 Aug 2018 11:34:23 +0200 Subject: [PATCH] Implement a keepalive on bpipe sockets fixes bug #2347 --- bacula/src/lib/bpipe.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bacula/src/lib/bpipe.c b/bacula/src/lib/bpipe.c index bcf64b2f0..16be0815c 100644 --- a/bacula/src/lib/bpipe.c +++ b/bacula/src/lib/bpipe.c @@ -34,6 +34,8 @@ #define getrlimit(a,b) -1 #endif +static void set_keepalive(int sockfd); + int execvp_errors[] = { EACCES, ENOEXEC, @@ -240,14 +242,17 @@ BPIPE *open_bpipe(char *prog, int wait, const char *mode, char *envp[]) free_pool_memory(tprog); if (mode_map & MODE_READ) { close(readp[1]); /* close unused parent fds */ + set_keepalive(readp[0]); bpipe->rfd = fdopen(readp[0], "r"); /* open file descriptor */ } if (mode_map & MODE_STDERR) { close(errp[1]); /* close unused parent fds */ + set_keepalive(errp[0]); bpipe->efd = fdopen(errp[0], "r"); /* open file descriptor */ } if (mode_map & MODE_WRITE) { close(writep[0]); + set_keepalive(writep[1]); bpipe->wfd = fdopen(writep[1], "w"); } bpipe->worker_stime = time(NULL); @@ -564,3 +569,17 @@ bail_out: free(buf); return stat1; } + +static void set_keepalive(int sockfd) +{ + /* + * Keep socket from timing out from inactivity + * Ignore all errors + */ + int turnon = 1; + setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (sockopt_val_t)&turnon, sizeof(turnon)); +#if defined(TCP_KEEPIDLE) + int opt = 240 /* 2 minuites in half-second intervals recommended by IBM */ + setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (sockopt_val_t)&opt, sizeof(opt)); +#endif +} -- 2.47.3