]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Implement a keepalive on bpipe sockets fixes bug #2347
authorKern Sibbald <kern@sibbald.com>
Wed, 8 Aug 2018 09:34:23 +0000 (11:34 +0200)
committerKern Sibbald <kern@sibbald.com>
Wed, 8 Aug 2018 09:34:23 +0000 (11:34 +0200)
bacula/src/lib/bpipe.c

index bcf64b2f0de1a185adf02e51648ff3c6fa684259..16be0815cfee553f88181dc214c598c227ed8fe0 100644 (file)
@@ -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
+}