From 6d969934f59c441d092a67e574d14e30f6ea4c75 Mon Sep 17 00:00:00 2001 From: Karl Heyes Date: Thu, 19 Feb 2004 15:24:06 +0000 Subject: [PATCH] Add checks for whether a source is active svn path=/trunk/icecast/; revision=5843 --- src/admin.c | 31 ++++++++++++++++++++----------- src/connection.c | 7 +++++++ src/yp.c | 5 +++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/admin.c b/src/admin.c index bd892e59..99c8d958 100644 --- a/src/admin.c +++ b/src/admin.c @@ -180,20 +180,21 @@ xmlDocPtr admin_build_sourcelist(char *current_source) node = avl_get_first(global.source_tree); while(node) { source = (source_t *)node->key; - srcnode = xmlNewChild(xmlnode, NULL, "source", NULL); - xmlSetProp(srcnode, "mount", source->mount); + if (source->running) + { + srcnode = xmlNewChild(xmlnode, NULL, "source", NULL); + xmlSetProp(srcnode, "mount", source->mount); - xmlNewChild(srcnode, NULL, "fallback", + xmlNewChild(srcnode, NULL, "fallback", (source->fallback_mount != NULL)? source->fallback_mount:""); - memset(buf, '\000', sizeof(buf)); - snprintf(buf, sizeof(buf)-1, "%ld", source->listeners); - xmlNewChild(srcnode, NULL, "listeners", buf); - memset(buf, '\000', sizeof(buf)); - snprintf(buf, sizeof(buf)-1, "%ld", now - source->con->con_time); - xmlNewChild(srcnode, NULL, "Connected", buf); - xmlNewChild(srcnode, NULL, "Format", - source->format->format_description); + snprintf(buf, sizeof(buf), "%ld", source->listeners); + xmlNewChild(srcnode, NULL, "listeners", buf); + snprintf(buf, sizeof(buf), "%ld", now - source->con->con_time); + xmlNewChild(srcnode, NULL, "Connected", buf); + xmlNewChild(srcnode, NULL, "Format", + source->format->format_description); + } node = avl_get_next(node); } return(doc); @@ -288,6 +289,14 @@ void admin_handle_request(client_t *client, char *uri) } else { + if (source->running == 0) + { + INFO2("Received admin command %s on unavailable mount \"%s\"", + command_string, mount); + avl_tree_unlock (global.source_tree); + client_send_400 (client, "Source is not available"); + return; + } INFO2("Received admin command %s on mount \"%s\"", command_string, mount); admin_handle_mount_request(client, source, command); diff --git a/src/connection.c b/src/connection.c index 07aed903..21371f7c 100644 --- a/src/connection.c +++ b/src/connection.c @@ -884,6 +884,13 @@ static void _handle_get_request(connection_t *con, avl_tree_unlock(global.source_tree); return; } + if (source->running == 0) + { + avl_tree_unlock(global.source_tree); + DEBUG0("inactive source, client dropped"); + client_send_404(client, "This mount is unavailable."); + return; + } /* Check for any required authentication first */ if(source->authenticator != NULL) { diff --git a/src/yp.c b/src/yp.c index 185a8e01..6f1a1ffe 100644 --- a/src/yp.c +++ b/src/yp.c @@ -160,6 +160,11 @@ int yp_touch() node = avl_get_first(global.source_tree); while (node) { source = (source_t *)node->key; + if (source->running == 0) + { + node = avl_get_next (node); + continue; + } current_time = time(NULL); if (!source->yp_public) { node = avl_get_next(node);