From 1d8544ef3b93d2a7b22e6bcbb47b19f2a0353eb1 Mon Sep 17 00:00:00 2001
From: Joshua Wise <jwise@nvidia.com>
Date: Thu, 15 Jan 2015 14:33:10 -0800
Subject: [PATCH] db/plugins/ProxyDatabasePlugin: add "keepalive" parameter

---
 NEWS                                   |  2 ++
 doc/user.xml                           | 13 +++++++++++++
 src/db/plugins/ProxyDatabasePlugin.cxx |  6 ++++++
 3 files changed, 21 insertions(+)

diff --git a/NEWS b/NEWS
index 17103fd4f..b8a460938 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,8 @@ ver 0.20 (not yet released)
 * reset song priority on playback
 * write database and state file atomically
 * remove dependency on GLib
+* database
+  - proxy: add TCP keepalive option
 
 ver 0.19.8 (2015/01/14)
 * input
diff --git a/doc/user.xml b/doc/user.xml
index 74c169c11..e5061f1ca 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -1530,6 +1530,19 @@ buffer_size: 16384</programlisting>
                   <application>MPD</application> instance.
                 </entry>
               </row>
+              <row>
+                <entry>
+                  <varname>keepalive</varname>
+                  <parameter>yes|no</parameter>
+                </entry>
+                <entry>
+                  Send TCP keepalive packets to the "master"
+                  <application>MPD</application> instance?  This option can
+                  help avoid certain firewalls dropping inactive
+                  connections, at the expensive of a very small amount of
+                  additional network traffic.  Disabled by default.
+                </entry>
+              </row>
             </tbody>
           </tgroup>
         </informaltable>
diff --git a/src/db/plugins/ProxyDatabasePlugin.cxx b/src/db/plugins/ProxyDatabasePlugin.cxx
index 01848690c..f7518c7ab 100644
--- a/src/db/plugins/ProxyDatabasePlugin.cxx
+++ b/src/db/plugins/ProxyDatabasePlugin.cxx
@@ -71,6 +71,7 @@ class ProxyDatabase final : public Database, SocketMonitor, IdleMonitor {
 
 	std::string host;
 	unsigned port;
+	bool keepalive;
 
 	struct mpd_connection *connection;
 
@@ -336,6 +337,7 @@ ProxyDatabase::Configure(const config_param &param, gcc_unused Error &error)
 {
 	host = param.GetBlockValue("host", "");
 	port = param.GetBlockValue("port", 0u);
+	keepalive = param.GetBlockValue("keepalive", false);
 
 	return true;
 }
@@ -376,6 +378,10 @@ ProxyDatabase::Connect(Error &error)
 		return false;
 	}
 
+#if LIBMPDCLIENT_CHECK_VERSION(2, 10, 0)
+	mpd_connection_set_keepalive(connection, keepalive);
+#endif
+
 	idle_received = unsigned(-1);
 	is_idle = false;