#define getrlimit(a,b) -1
#endif
+static void set_keepalive(int sockfd);
+
int execvp_errors[] = {
EACCES,
ENOEXEC,
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);
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
+}