diff options
author | Max Kellermann <max@duempel.org> | 2009-11-05 23:47:29 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-11-05 23:47:29 +0100 |
commit | 945287358b6e935d994a3411da097aba107e592d (patch) | |
tree | 1eceabefd56eec9fb62007493a170da83184f3b4 /src/output | |
parent | 979cd5a7684ae6089abb1b6280539fe563a783fb (diff) | |
download | mpd-945287358b6e935d994a3411da097aba107e592d.tar.gz mpd-945287358b6e935d994a3411da097aba107e592d.tar.xz mpd-945287358b6e935d994a3411da097aba107e592d.zip |
output/httpd: bind port when output is enabled
Implement the methods enable() and disable(). Bind the HTTP port in
the enable() method, but reject all incoming connections until the
output is opened.
Diffstat (limited to 'src/output')
-rw-r--r-- | src/output/httpd_internal.h | 7 | ||||
-rw-r--r-- | src/output/httpd_output_plugin.c | 55 |
2 files changed, 49 insertions, 13 deletions
diff --git a/src/output/httpd_internal.h b/src/output/httpd_internal.h index 83e9498c6..22155b7ba 100644 --- a/src/output/httpd_internal.h +++ b/src/output/httpd_internal.h @@ -30,11 +30,18 @@ #include <glib.h> #include <sys/socket.h> +#include <stdbool.h> struct httpd_client; struct httpd_output { /** + * True if the audio output is open and accepts client + * connections. + */ + bool open; + + /** * The configured encoder plugin. */ struct encoder *encoder; diff --git a/src/output/httpd_output_plugin.c b/src/output/httpd_output_plugin.c index 675297cd3..9e82489ca 100644 --- a/src/output/httpd_output_plugin.c +++ b/src/output/httpd_output_plugin.c @@ -151,8 +151,9 @@ httpd_listen_in_event(G_GNUC_UNUSED GIOChannel *source, fd = accept(httpd->fd, (struct sockaddr*)&sa, &sa_length); if (fd >= 0) { /* can we allow additional client */ - if (!httpd->clients_max || - httpd->clients_cnt < httpd->clients_max) + if (httpd->open && + (httpd->clients_max == 0 || + httpd->clients_cnt < httpd->clients_max)) httpd_client_add(httpd, fd); else close(fd); @@ -208,31 +209,56 @@ httpd_output_encoder_open(struct httpd_output *httpd, } static bool -httpd_output_open(void *data, struct audio_format *audio_format, - GError **error) +httpd_output_enable(void *data, GError **error_r) { struct httpd_output *httpd = data; - bool success; GIOChannel *channel; - g_mutex_lock(httpd->mutex); + httpd->open = false; /* create and set up listener socket */ httpd->fd = socket_bind_listen(PF_INET, SOCK_STREAM, 0, (struct sockaddr *)&httpd->address, httpd->address_size, - 16, error); - if (httpd->fd < 0) { - g_mutex_unlock(httpd->mutex); + 16, error_r); + if (httpd->fd < 0) return false; - } + + g_mutex_lock(httpd->mutex); channel = g_io_channel_unix_new(httpd->fd); httpd->source_id = g_io_add_watch(channel, G_IO_IN, httpd_listen_in_event, httpd); g_io_channel_unref(channel); + g_mutex_unlock(httpd->mutex); + + return true; +} + +static void +httpd_output_disable(void *data) +{ + struct httpd_output *httpd = data; + + g_mutex_lock(httpd->mutex); + + g_source_remove(httpd->source_id); + close(httpd->fd); + + g_mutex_unlock(httpd->mutex); +} + +static bool +httpd_output_open(void *data, struct audio_format *audio_format, + GError **error) +{ + struct httpd_output *httpd = data; + bool success; + + g_mutex_lock(httpd->mutex); + /* open the encoder */ success = httpd_output_encoder_open(httpd, audio_format, error); @@ -249,6 +275,8 @@ httpd_output_open(void *data, struct audio_format *audio_format, httpd->clients_cnt = 0; httpd->timer = timer_new(audio_format); + httpd->open = true; + g_mutex_unlock(httpd->mutex); return true; } @@ -267,6 +295,8 @@ static void httpd_output_close(void *data) g_mutex_lock(httpd->mutex); + httpd->open = false; + timer_free(httpd->timer); g_list_foreach(httpd->clients, httpd_client_delete, NULL); @@ -277,9 +307,6 @@ static void httpd_output_close(void *data) encoder_close(httpd->encoder); - g_source_remove(httpd->source_id); - close(httpd->fd); - g_mutex_unlock(httpd->mutex); } @@ -478,6 +505,8 @@ const struct audio_output_plugin httpd_output_plugin = { .name = "httpd", .init = httpd_output_init, .finish = httpd_output_finish, + .enable = httpd_output_enable, + .disable = httpd_output_disable, .open = httpd_output_open, .close = httpd_output_close, .send_tag = httpd_output_tag, |