diff options
-rw-r--r-- | doc/mpdconf.example | 1 | ||||
-rw-r--r-- | doc/user.xml | 10 | ||||
-rw-r--r-- | src/output/httpd_internal.h | 6 | ||||
-rw-r--r-- | src/output/httpd_output_plugin.c | 17 |
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 |