mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-12-04 14:46:30 -05:00
Feature: Allow <relay> within <mount>
This commit is contained in:
parent
1e230972fa
commit
1c61903793
@ -145,8 +145,8 @@ static void _parse_http_headers(xmlDocPtr doc,
|
|||||||
xmlNodePtr node,
|
xmlNodePtr node,
|
||||||
ice_config_http_header_t **http_headers);
|
ice_config_http_header_t **http_headers);
|
||||||
|
|
||||||
static void _parse_relay(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c);
|
static void _parse_relay(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c, const char *mount);
|
||||||
static void _parse_mount(xmlDocPtr doc, xmlNodePtr node, ice_config_t *c);
|
static void _parse_mount(xmlDocPtr doc, xmlNodePtr parentnode, ice_config_t *c);
|
||||||
|
|
||||||
static void _parse_listen_socket(xmlDocPtr doc,
|
static void _parse_listen_socket(xmlDocPtr doc,
|
||||||
xmlNodePtr node,
|
xmlNodePtr node,
|
||||||
@ -1062,7 +1062,7 @@ static void _parse_root(xmlDocPtr doc,
|
|||||||
} else if (xmlStrcmp(node->name, XMLSTR("http-headers")) == 0) {
|
} else if (xmlStrcmp(node->name, XMLSTR("http-headers")) == 0) {
|
||||||
_parse_http_headers(doc, node->xmlChildrenNode, &(configuration->http_headers));
|
_parse_http_headers(doc, node->xmlChildrenNode, &(configuration->http_headers));
|
||||||
} else if (xmlStrcmp(node->name, XMLSTR("relay")) == 0) {
|
} else if (xmlStrcmp(node->name, XMLSTR("relay")) == 0) {
|
||||||
_parse_relay(doc, node->xmlChildrenNode, configuration);
|
_parse_relay(doc, node->xmlChildrenNode, configuration, NULL);
|
||||||
} else if (xmlStrcmp(node->name, XMLSTR("mount")) == 0) {
|
} else if (xmlStrcmp(node->name, XMLSTR("mount")) == 0) {
|
||||||
_parse_mount(doc, node, configuration);
|
_parse_mount(doc, node, configuration);
|
||||||
} else if (xmlStrcmp(node->name, XMLSTR("directory")) == 0) {
|
} else if (xmlStrcmp(node->name, XMLSTR("directory")) == 0) {
|
||||||
@ -1358,7 +1358,7 @@ static void _parse_mount_oldstyle_authentication(mount_proxy *mount,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _parse_mount(xmlDocPtr doc,
|
static void _parse_mount(xmlDocPtr doc,
|
||||||
xmlNodePtr node,
|
xmlNodePtr parentnode,
|
||||||
ice_config_t *configuration)
|
ice_config_t *configuration)
|
||||||
{
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
@ -1368,6 +1368,7 @@ static void _parse_mount(xmlDocPtr doc,
|
|||||||
char *username = NULL;
|
char *username = NULL;
|
||||||
char *password = NULL;
|
char *password = NULL;
|
||||||
auth_stack_t *authstack = NULL;
|
auth_stack_t *authstack = NULL;
|
||||||
|
xmlNodePtr node;
|
||||||
|
|
||||||
/* default <mount> settings */
|
/* default <mount> settings */
|
||||||
mount->mounttype = MOUNT_TYPE_NORMAL;
|
mount->mounttype = MOUNT_TYPE_NORMAL;
|
||||||
@ -1378,7 +1379,7 @@ static void _parse_mount(xmlDocPtr doc,
|
|||||||
mount->max_history = -1;
|
mount->max_history = -1;
|
||||||
mount->next = NULL;
|
mount->next = NULL;
|
||||||
|
|
||||||
tmp = (char *)xmlGetProp(node, XMLSTR("type"));
|
tmp = (char *)xmlGetProp(parentnode, XMLSTR("type"));
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
if (strcmp(tmp, "normal") == 0) {
|
if (strcmp(tmp, "normal") == 0) {
|
||||||
mount->mounttype = MOUNT_TYPE_NORMAL;
|
mount->mounttype = MOUNT_TYPE_NORMAL;
|
||||||
@ -1392,7 +1393,7 @@ static void _parse_mount(xmlDocPtr doc,
|
|||||||
xmlFree(tmp);
|
xmlFree(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
node = node->xmlChildrenNode;
|
node = parentnode->xmlChildrenNode;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (node == NULL)
|
if (node == NULL)
|
||||||
@ -1545,6 +1546,25 @@ static void _parse_mount(xmlDocPtr doc,
|
|||||||
}
|
}
|
||||||
} while ((node = node->next));
|
} while ((node = node->next));
|
||||||
|
|
||||||
|
/* Do a second interation as we need to know mount->mountname, and mount->mounttype first */
|
||||||
|
node = parentnode->xmlChildrenNode;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (node == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (xmlStrcmp(node->name, XMLSTR("relay")) == 0) {
|
||||||
|
if (mount->mounttype != MOUNT_TYPE_NORMAL) {
|
||||||
|
ICECAST_LOG_WARN("<relay> set within <mount> for mountpoint %s%s%s that is not type=\"normal\"",
|
||||||
|
(mount->mountname ? "\"" : ""), (mount->mountname ? mount->mountname : "<no name>"), (mount->mountname ? "\"" : ""));
|
||||||
|
} else if (!mount->mountname || mount->mountname[0] != '/') {
|
||||||
|
ICECAST_LOG_WARN("<relay> set within <mount> with no mountpoint defined.");
|
||||||
|
} else {
|
||||||
|
_parse_relay(doc, node->xmlChildrenNode, configuration, mount->mountname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ((node = node->next));
|
||||||
|
|
||||||
if (password) {
|
if (password) {
|
||||||
auth_stack_t *old_style = NULL;
|
auth_stack_t *old_style = NULL;
|
||||||
__append_old_style_auth(&old_style, "legacy-mount-source",
|
__append_old_style_auth(&old_style, "legacy-mount-source",
|
||||||
@ -1737,7 +1757,8 @@ static void _parse_relay_upstream_apply_defaults(relay_config_upstream_t *upstre
|
|||||||
|
|
||||||
static void _parse_relay(xmlDocPtr doc,
|
static void _parse_relay(xmlDocPtr doc,
|
||||||
xmlNodePtr node,
|
xmlNodePtr node,
|
||||||
ice_config_t *configuration)
|
ice_config_t *configuration,
|
||||||
|
const char *mount)
|
||||||
{
|
{
|
||||||
char *tmp;
|
char *tmp;
|
||||||
relay_config_t *relay = calloc(1, sizeof(relay_config_t));
|
relay_config_t *relay = calloc(1, sizeof(relay_config_t));
|
||||||
@ -1763,10 +1784,14 @@ static void _parse_relay(xmlDocPtr doc,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (xmlStrcmp(node->name, XMLSTR("local-mount")) == 0) {
|
if (xmlStrcmp(node->name, XMLSTR("local-mount")) == 0) {
|
||||||
|
if (mount) {
|
||||||
|
ICECAST_LOG_WARN("Relay defined within mount \"%s\" defines <local-mount> which is ignored.", mount);
|
||||||
|
} else {
|
||||||
if (relay->localmount)
|
if (relay->localmount)
|
||||||
xmlFree(relay->localmount);
|
xmlFree(relay->localmount);
|
||||||
relay->localmount = (char *)xmlNodeListGetString(doc,
|
relay->localmount = (char *)xmlNodeListGetString(doc,
|
||||||
node->xmlChildrenNode, 1);
|
node->xmlChildrenNode, 1);
|
||||||
|
}
|
||||||
} else if (xmlStrcmp(node->name, XMLSTR("on-demand")) == 0) {
|
} else if (xmlStrcmp(node->name, XMLSTR("on-demand")) == 0) {
|
||||||
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
tmp = (char *)xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
|
||||||
relay->on_demand = util_str_to_bool(tmp);
|
relay->on_demand = util_str_to_bool(tmp);
|
||||||
@ -1796,6 +1821,10 @@ static void _parse_relay(xmlDocPtr doc,
|
|||||||
|
|
||||||
_parse_relay_upstream_apply_defaults(&(relay->upstream_default));
|
_parse_relay_upstream_apply_defaults(&(relay->upstream_default));
|
||||||
|
|
||||||
|
if (mount) {
|
||||||
|
relay->localmount = (char *)xmlStrdup(XMLSTR(mount));
|
||||||
|
}
|
||||||
|
|
||||||
if (relay->localmount == NULL)
|
if (relay->localmount == NULL)
|
||||||
relay->localmount = (char *)xmlStrdup(XMLSTR(relay->upstream_default.mount));
|
relay->localmount = (char *)xmlStrdup(XMLSTR(relay->upstream_default.mount));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user