aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/mpdconf.example1
-rw-r--r--doc/user.xml10
-rw-r--r--src/output/httpd_internal.h6
-rw-r--r--src/output/httpd_output_plugin.c17
4 files changed, 31 insertions, 3 deletions
diff --git a/doc/mpdconf.example b/doc/mpdconf.example
index 166212ebd..6da84fc37 100644
--- a/doc/mpdconf.example
+++ b/doc/mpdconf.example
@@ -252,6 +252,7 @@ input {
## quality "5.0" # do not define if bitrate is defined
# bitrate "128" # do not define if quality is defined
# format "44100:16:1"
+# max_clients "0" # optional 0=no limit
#}
#
# An example of a pulseaudio output (streaming to a remote pulseaudio server)
diff --git a/doc/user.xml b/doc/user.xml
index 8111482d4..2e4261d3e 100644
--- a/doc/user.xml
+++ b/doc/user.xml
@@ -803,6 +803,16 @@ cd mpd-version</programlisting>
second.
</entry>
</row>
+ <row>
+ <entry>
+ <varname>max_clients</varname>
+ <parameter>MC</parameter>
+ </entry>
+ <entry>
+ Sets a limit, number of concurrent clients. When set
+ to 0 no limit will apply.
+ </entry>
+ </row>
</tbody>
</tgroup>
</informaltable>
diff --git a/src/output/httpd_internal.h b/src/output/httpd_internal.h
index 2257e27a2..83e9498c6 100644
--- a/src/output/httpd_internal.h
+++ b/src/output/httpd_internal.h
@@ -97,6 +97,12 @@ struct httpd_output {
* function.
*/
char buffer[32768];
+
+ /**
+ * The maximum and current number of clients connected
+ * at the same time.
+ */
+ guint clients_max, clients_cnt;
};
/**
diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c
index d1296abc2..675297cd3 100644
--- a/src/output/httpd_output_plugin.c
+++ b/src/output/httpd_output_plugin.c
@@ -76,6 +76,8 @@ httpd_output_init(G_GNUC_UNUSED const struct audio_format *audio_format,
else
httpd->content_type = "application/octet-stream";
+ httpd->clients_max = config_get_block_unsigned(param,"max_clients", 0);
+
/* initialize listen address */
sin = (struct sockaddr_in *)&httpd->address;
@@ -124,6 +126,7 @@ httpd_client_add(struct httpd_output *httpd, int fd)
httpd->encoder->plugin->tag == NULL);
httpd->clients = g_list_prepend(httpd->clients, client);
+ httpd->clients_cnt++;
/* pass metadata to client */
if (httpd->metadata)
@@ -146,10 +149,16 @@ httpd_listen_in_event(G_GNUC_UNUSED GIOChannel *source,
connected */
fd = accept(httpd->fd, (struct sockaddr*)&sa, &sa_length);
- if (fd >= 0)
- httpd_client_add(httpd, fd);
- else if (fd < 0 && errno != EINTR)
+ if (fd >= 0) {
+ /* can we allow additional client */
+ if (!httpd->clients_max ||
+ httpd->clients_cnt < httpd->clients_max)
+ httpd_client_add(httpd, fd);
+ else
+ close(fd);
+ } else if (fd < 0 && errno != EINTR) {
g_warning("accept() failed: %s", g_strerror(errno));
+ }
g_mutex_unlock(httpd->mutex);
@@ -237,6 +246,7 @@ httpd_output_open(void *data, struct audio_format *audio_format,
/* initialize other attributes */
httpd->clients = NULL;
+ httpd->clients_cnt = 0;
httpd->timer = timer_new(audio_format);
g_mutex_unlock(httpd->mutex);
@@ -281,6 +291,7 @@ httpd_output_remove_client(struct httpd_output *httpd,
assert(client != NULL);
httpd->clients = g_list_remove(httpd->clients, client);
+ httpd->clients_cnt--;
}
void