1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-12-04 14:46:30 -05:00

allow for multiple shoutcast style source clients to connect. They don't

provide a mountpoint so you specify a shoutcast-mount in the listen-socket
section. Specifying this will automatically define the port+1 with the same
settings however the original shoutcast-compat approach is maintained.

svn path=/icecast/trunk/icecast/; revision=14045
This commit is contained in:
Karl Heyes 2007-10-25 02:25:49 +00:00
parent 88514b9c8e
commit 0a347a6817
4 changed files with 52 additions and 6 deletions

View File

@ -335,14 +335,22 @@ void admin_handle_request(client_t *client, const char *uri)
if (command == COMMAND_SHOUTCAST_METADATA_UPDATE) { if (command == COMMAND_SHOUTCAST_METADATA_UPDATE) {
ice_config_t *config; ice_config_t *config;
const char *sc_mount;
const char *pass = httpp_get_query_param (client->parser, "pass"); const char *pass = httpp_get_query_param (client->parser, "pass");
listener_t *listener;
if (pass == NULL) if (pass == NULL)
{ {
client_send_400 (client, "missing pass parameter"); client_send_400 (client, "missing pass parameter");
return; return;
} }
config = config_get_config (); config = config_get_config ();
httpp_set_query_param (client->parser, "mount", (char *)config->shoutcast_mount); sc_mount = config->shoutcast_mount;
listener = config_get_listen_sock (config, client->con);
if (listener && listener->shoutcast_mount)
sc_mount = listener->shoutcast_mount;
httpp_set_query_param (client->parser, "mount", sc_mount);
httpp_setvar (client->parser, HTTPP_VAR_PROTOCOL, "ICY"); httpp_setvar (client->parser, HTTPP_VAR_PROTOCOL, "ICY");
httpp_setvar (client->parser, HTTPP_VAR_ICYPASSWORD, pass); httpp_setvar (client->parser, HTTPP_VAR_ICYPASSWORD, pass);
config_release_config (); config_release_config ();

View File

@ -157,6 +157,7 @@ listener_t *config_clear_listener (listener_t *listener)
{ {
next = listener->next; next = listener->next;
if (listener->bind_address) xmlFree (listener->bind_address); if (listener->bind_address) xmlFree (listener->bind_address);
if (listener->shoutcast_mount) xmlFree (listener->shoutcast_mount);
free (listener); free (listener);
} }
return next; return next;
@ -800,7 +801,13 @@ static void _parse_listen_socket(xmlDocPtr doc, xmlNodePtr node,
listener->shoutcast_compat = atoi(tmp); listener->shoutcast_compat = atoi(tmp);
if(tmp) xmlFree(tmp); if(tmp) xmlFree(tmp);
} }
else if (xmlStrcmp (node->name, XMLSTR("shoutcast-mount")) == 0) {
if (listener->shoutcast_mount) xmlFree (listener->shoutcast_mount);
listener->shoutcast_mount = (char *)xmlNodeListGetString(doc,
node->xmlChildrenNode, 1);
}
else if (xmlStrcmp (node->name, XMLSTR("bind-address")) == 0) { else if (xmlStrcmp (node->name, XMLSTR("bind-address")) == 0) {
if (listener->bind_address) xmlFree (listener->bind_address);
listener->bind_address = (char *)xmlNodeListGetString(doc, listener->bind_address = (char *)xmlNodeListGetString(doc,
node->xmlChildrenNode, 1); node->xmlChildrenNode, 1);
} }
@ -809,6 +816,19 @@ static void _parse_listen_socket(xmlDocPtr doc, xmlNodePtr node,
listener->next = configuration->listen_sock; listener->next = configuration->listen_sock;
configuration->listen_sock = listener; configuration->listen_sock = listener;
configuration->listen_sock_count++; configuration->listen_sock_count++;
if (listener->shoutcast_mount)
{
listener_t *sc_port = calloc (1, sizeof (listener_t));
sc_port->port = listener->port+1;
sc_port->shoutcast_compat = 1;
sc_port->shoutcast_mount = (char*)xmlStrdup (XMLSTR(listener->shoutcast_mount));
if (listener->bind_address)
sc_port->bind_address = (char*)xmlStrdup (XMLSTR(listener->bind_address));
sc_port->next = configuration->listen_sock;
configuration->listen_sock = sc_port;
configuration->listen_sock_count++;
}
} }
static void _parse_authentication(xmlDocPtr doc, xmlNodePtr node, static void _parse_authentication(xmlDocPtr doc, xmlNodePtr node,

View File

@ -103,6 +103,7 @@ typedef struct _listener_t {
int port; int port;
char *bind_address; char *bind_address;
int shoutcast_compat; int shoutcast_compat;
char *shoutcast_mount;
int ssl; int ssl;
} listener_t; } listener_t;

View File

@ -87,6 +87,7 @@ typedef struct client_queue_tag {
int offset; int offset;
int stream_offset; int stream_offset;
int shoutcast; int shoutcast;
char *shoutcast_mount;
struct client_queue_tag *next; struct client_queue_tag *next;
} client_queue_t; } client_queue_t;
@ -758,6 +759,8 @@ void connection_accept_loop(void)
node->shoutcast = 1; node->shoutcast = 1;
if (listener->ssl && ssl_ok) if (listener->ssl && ssl_ok)
connection_uses_ssl (client->con); connection_uses_ssl (client->con);
if (listener->shoutcast_mount)
node->shoutcast_mount = strdup (listener->shoutcast_mount);
} }
config_release_config(); config_release_config();
@ -1096,7 +1099,6 @@ static void _handle_stats_request (client_t *client, char *uri)
static void _handle_get_request (client_t *client, char *passed_uri) static void _handle_get_request (client_t *client, char *passed_uri)
{ {
int fileserve;
int port; int port;
char *serverhost = NULL; char *serverhost = NULL;
int serverport = 0; int serverport = 0;
@ -1106,7 +1108,6 @@ static void _handle_get_request (client_t *client, char *passed_uri)
listener_t *listen_sock; listener_t *listen_sock;
config = config_get_config(); config = config_get_config();
fileserve = config->fileserve;
port = config->port; port = config->port;
listen_sock = config_get_listen_sock (config, client->con); listen_sock = config_get_listen_sock (config, client->con);
@ -1160,10 +1161,15 @@ static void _handle_shoutcast_compatible (client_queue_t *node)
char *shoutcast_mount; char *shoutcast_mount;
client_t *client = node->client; client_t *client = node->client;
if (node->shoutcast_mount)
shoutcast_mount = node->shoutcast_mount;
else
shoutcast_mount = config->shoutcast_mount;
if (node->shoutcast == 1) if (node->shoutcast == 1)
{ {
char *source_password, *ptr, *headers; char *source_password, *ptr, *headers;
mount_proxy *mountinfo = config_find_mount (config, config->shoutcast_mount); mount_proxy *mountinfo = config_find_mount (config, shoutcast_mount);
if (mountinfo && mountinfo->password) if (mountinfo && mountinfo->password)
source_password = strdup (mountinfo->password); source_password = strdup (mountinfo->password);
@ -1192,6 +1198,7 @@ static void _handle_shoutcast_compatible (client_queue_t *node)
{ {
client_destroy (client); client_destroy (client);
free (source_password); free (source_password);
free (node->shoutcast_mount);
free (node); free (node);
return; return;
} }
@ -1215,10 +1222,12 @@ static void _handle_shoutcast_compatible (client_queue_t *node)
INFO1 ("password does not match \"%s\"", client->refbuf->data); INFO1 ("password does not match \"%s\"", client->refbuf->data);
client_destroy (client); client_destroy (client);
free (source_password); free (source_password);
free (node->shoutcast_mount);
free (node); free (node);
return; return;
} }
shoutcast_mount = strdup (config->shoutcast_mount); /* actually make a copy as we are dropping the config lock */
shoutcast_mount = strdup (shoutcast_mount);
config_release_config(); config_release_config();
/* Here we create a valid HTTP request based of the information /* Here we create a valid HTTP request based of the information
that was passed in via the non-HTTP style protocol above. This that was passed in via the non-HTTP style protocol above. This
@ -1249,6 +1258,7 @@ static void _handle_shoutcast_compatible (client_queue_t *node)
} }
free (http_compliant); free (http_compliant);
free (shoutcast_mount); free (shoutcast_mount);
free (node->shoutcast_mount);
free (node); free (node);
return; return;
} }
@ -1295,6 +1305,14 @@ static void *_handle_connection(void *arg)
client->refbuf->len = node->offset - node->stream_offset; client->refbuf->len = node->offset - node->stream_offset;
memmove (ptr, ptr + node->stream_offset, client->refbuf->len); memmove (ptr, ptr + node->stream_offset, client->refbuf->len);
} }
rawuri = httpp_getvar(parser, HTTPP_VAR_URI);
/* assign a port-based shoutcast mountpoint if required */
if (node->shoutcast_mount && strcmp (rawuri, "/admin.cgi") == 0)
httpp_set_query_param (client->parser, "mount", node->shoutcast_mount);
free (node->shoutcast_mount);
free (node); free (node);
if (strcmp("ICE", httpp_getvar(parser, HTTPP_VAR_PROTOCOL)) && if (strcmp("ICE", httpp_getvar(parser, HTTPP_VAR_PROTOCOL)) &&
@ -1304,7 +1322,6 @@ static void *_handle_connection(void *arg)
continue; continue;
} }
rawuri = httpp_getvar(parser, HTTPP_VAR_URI);
uri = util_normalise_uri(rawuri); uri = util_normalise_uri(rawuri);
if (uri == NULL) if (uri == NULL)