Exemplo n.º 1
0
static int _parse_chown (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;
    struct cfg_tag icecast_tags[] =
    {
        { "user",   config_get_str, &config->user },
        { "group",  config_get_str, &config->group },
        { NULL, NULL, NULL }
    };

    if (parse_xml_tags (node, icecast_tags))
        return -1;
    config->chuid = 1;
    return 0;
}
Exemplo n.º 2
0
static int _parse_playlistlog (xmlNodePtr node, void *arg)
{
    playlist_log *log = arg;
    struct cfg_tag icecast_tags[] =
    {
        { "name",           config_get_str,     &log->name },
        { "archive",        config_get_bool,    &log->archive },
        { "display",        config_get_int,     &log->display },
        { "size",           config_get_int,     &log->size },
        { "duration",       config_get_int,     &log->duration },
        { NULL, NULL, NULL }
    };

    log->logid = -1;
    return parse_xml_tags (node, icecast_tags);
}
Exemplo n.º 3
0
static int _parse_errorlog (xmlNodePtr node, void *arg)
{
    error_log *log = arg;
    struct cfg_tag icecast_tags[] =
    {
        { "name",           config_get_str,     &log->name },
        { "archive",        config_get_bool,    &log->archive },
        { "display",        config_get_int,     &log->display },
        { "level",          config_get_int,     &log->level },
        { "size",           config_get_int,     &log->size },
        { NULL, NULL, NULL }
    };

    log->logid = -1;
    log->level = 3;
    return parse_xml_tags (node, icecast_tags);
}
Exemplo n.º 4
0
static int _parse_authentication (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;
    struct cfg_tag icecast_tags[] =
    {
        { "source-password",    config_get_str,     &config->source_password },
        { "admin-user",         config_get_str,     &config->admin_username },
        { "admin-password",     config_get_str,     &config->admin_password },
        { "relay-user",         config_get_str,     &config->relay_username },
        { "relay-password",     config_get_str,     &config->relay_password },
        { NULL, NULL, NULL }
    };

    if (parse_xml_tags (node, icecast_tags))
        return -1;
    return 0;
}
Exemplo n.º 5
0
static int _relay_master (xmlNodePtr node, void *arg)
{
    relay_server *relay = arg;
    relay_server_master *last, *master = calloc (1, sizeof (relay_server_master));

    struct cfg_tag icecast_tags[] =
    {
        { "ip",             config_get_str,     &master->ip },
        { "server",         config_get_str,     &master->ip },
        { "port",           config_get_int,     &master->port },
        { "mount",          config_get_str,     &master->mount },
        { "bind",           config_get_str,     &master->bind },
        { "timeout",        config_get_int,     &master->timeout },
        { NULL, NULL, NULL },
    };

    /* default master details taken from the default relay settings */
    master->ip = (char *)xmlCharStrdup (relay->masters->ip);
    master->mount = (char *)xmlCharStrdup (relay->masters->mount);
    if (relay->masters->bind)
        master->bind = (char *)xmlCharStrdup (relay->masters->bind);
    master->port = relay->masters->port;
    master->timeout = relay->masters->timeout;

    if (parse_xml_tags (node, icecast_tags))
        return -1;

    if (master->port < 1 || master->port > 65535)
        master->port = 8000;
    if (master->timeout < 1 || master->timeout > 60)
        master->timeout = 4;

    /* place new details at the end of the list */
    last = relay->masters;
    while (last->next)
        last = last->next;
    last->next = master;

    return 0;
}
Exemplo n.º 6
0
static int _parse_directory (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;

    struct cfg_tag icecast_tags[] =
    {
        { "yp-url",         config_get_str, &config->yp_url [config->num_yp_directories]},
        { "yp-url-timeout", config_get_int, &config->yp_url_timeout [config->num_yp_directories]},
        { "touch-interval", config_get_int, &config->yp_touch_interval [config->num_yp_directories]},
        { NULL, NULL, NULL }
    };

    if (config->num_yp_directories >= MAX_YP_DIRECTORIES)
    {
        ERROR0("Maximum number of yp directories exceeded!");
        return -1;
    }

    if (parse_xml_tags (node, icecast_tags))
        return -1;
    config->num_yp_directories++;
    return 0;
}
Exemplo n.º 7
0
static int _parse_master (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;

    struct cfg_tag icecast_tags[] =
    {
        { "server",             config_get_str,     &config->master_server },
        { "port",               config_get_int,     &config->master_server_port },
        { "ssl-port",           config_get_int,     &config->master_ssl_port },
        { "username",           config_get_str,     &config->master_username },
        { "password",           config_get_str,     &config->master_password },
        { "bind",               config_get_str,     &config->master_bind },
        { "interval",           config_get_int,     &config->master_update_interval },
        { "relay-auth",         config_get_bool,    &config->master_relay_auth },
        { "redirect",           config_get_bool,    &config->master_redirect },
        { NULL, NULL, NULL },
    };

    if (parse_xml_tags (node, icecast_tags))
        return -1;

    return 0;
}
Exemplo n.º 8
0
static int _parse_limits (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;

    struct cfg_tag icecast_tags[] =
    {
        { "max-bandwidth",  config_get_bitrate,&config->max_bandwidth },
        { "clients",        config_get_int,    &config->client_limit },
        { "sources",        config_get_int,    &config->source_limit },
        { "queue-size",     config_get_int,    &config->queue_size_limit },
        { "min-queue-size", config_get_int,    &config->min_queue_size },
        { "burst-size",     config_get_int,    &config->burst_size },
        { "workers",        config_get_int,    &config->workers_count },
        { "client-timeout", config_get_int,    &config->client_timeout },
        { "header-timeout", config_get_int,    &config->header_timeout },
        { "source-timeout", config_get_int,    &config->source_timeout },
        { NULL, NULL, NULL },
    };
    if (parse_xml_tags (node, icecast_tags))
        return -1;
    if (config->workers_count < 1)   config->workers_count = 1;
    if (config->workers_count > 400) config->workers_count = 400;
    return 0;
}
Exemplo n.º 9
0
static int _parse_mount (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;
    mount_proxy *mount = calloc(1, sizeof(mount_proxy));

    struct cfg_tag icecast_tags[] =
    {
        { "mount-name",         config_get_str,     &mount->mountname },
        { "source-timeout",     config_get_int,     &mount->source_timeout },
        { "queue-size",         config_get_int,     &mount->queue_size_limit },
        { "burst-size",         config_get_int,     &mount->burst_size},
        { "min-queue-size",     config_get_int,     &mount->min_queue_size},
        { "username",           config_get_str,     &mount->username },
        { "password",           config_get_str,     &mount->password },
        { "dump-file",          config_get_str,     &mount->dumpfile },
        { "intro",              config_get_str,     &mount->intro_filename },
        { "file-seekable",      config_get_bool,    &mount->file_seekable },
        { "fallback-mount",     config_get_str,     &mount->fallback_mount },
        { "fallback-override",  config_get_bool,    &mount->fallback_override },
        { "fallback-when-full", config_get_bool,    &mount->fallback_when_full },
        { "max-listeners",      config_get_int,     &mount->max_listeners },
        { "max-bandwidth",      config_get_bitrate, &mount->max_bandwidth },
        { "wait-time",          config_get_int,     &mount->wait_time },
        { "filter-theora",      config_get_bool,    &mount->filter_theora },
        { "limit-rate",         config_get_bitrate, &mount->limit_rate },
        { "skip-accesslog",     config_get_bool,    &mount->skip_accesslog },
        { "charset",            config_get_str,     &mount->charset },
        { "qblock-size",        config_get_int,     &mount->queue_block_size },
        { "redirect",           config_get_str,     &mount->redirect },
        { "metadata-interval",  config_get_int,     &mount->mp3_meta_interval },
        { "mp3-metadata-interval",
                                config_get_int,     &mount->mp3_meta_interval },
        { "ogg-passthrough",    config_get_bool,    &mount->ogg_passthrough },
        { "admin_comments_only",config_get_bool,    &mount->admin_comments_only },
        { "allow-url-ogg-metadata",
                                config_get_bool,    &mount->url_ogg_meta },
        { "no-mount",           config_get_bool,    &mount->no_mount },
        { "ban-client",         config_get_int,     &mount->ban_client },
        { "so-sndbuf",          config_get_int,     &mount->so_sndbuf },
        { "hidden",             config_get_bool,    &mount->hidden },
        { "authentication",     auth_get_authenticator, &mount->auth },
        { "on-connect",         config_get_str,     &mount->on_connect },
        { "on-disconnect",      config_get_str,     &mount->on_disconnect },
        { "max-stream-duration",
                                config_get_int,     &mount->max_stream_duration },
        { "max-listener-duration",
                                config_get_int,     &mount->max_listener_duration },
        { "accesslog",          _parse_accesslog,   &mount->access_log },
        /* YP settings */
        { "cluster-password",   config_get_str,     &mount->cluster_password },
        { "stream-name",        config_get_str,     &mount->stream_name },
        { "stream-description", config_get_str,     &mount->stream_description },
        { "stream-url",         config_get_str,     &mount->stream_url },
        { "genre",              config_get_str,     &mount->stream_genre },
        { "bitrate",            config_get_str,     &mount->bitrate },
        { "public",             config_get_bool,    &mount->yp_public },
        { "type",               config_get_str,     &mount->type },
        { "subtype",            config_get_str,     &mount->subtype },
        { NULL, NULL, NULL },
    };

    /* default <mount> settings */
    mount->max_listeners = -1;
    mount->max_bandwidth = -1;
    mount->burst_size = -1;
    mount->min_queue_size = -1;
    mount->mp3_meta_interval = -1;
    mount->yp_public = -1;
    mount->url_ogg_meta = 1;
    mount->source_timeout = config->source_timeout;
    mount->file_seekable = 1;
    mount->access_log.type = LOG_ACCESS_CLF;
    mount->access_log.logid = -1;
    mount->access_log.log_ip = 1;
    mount->fallback_override = 1;

    if (parse_xml_tags (node, icecast_tags))
        return -1;
    
    if (mount->mountname == NULL)
    {
        config_clear_mount (mount);
        return -1;
    }
    if (mount->auth)
        mount->auth->mount = strdup (mount->mountname);
    if (mount->admin_comments_only)
        mount->url_ogg_meta = 1;
    if (mount->url_ogg_meta)
        mount->ogg_passthrough = 0;
    if (mount->min_queue_size < 0)
        mount->min_queue_size = mount->burst_size;
    if (mount->queue_block_size < 100)
        mount->queue_block_size = 1400;
    if (mount->ban_client < 0)
        mount->no_mount = 0;

    mount->next = config->mounts;
    config->mounts = mount;

    return 0;
}
Exemplo n.º 10
0
static int _parse_root (xmlNodePtr node, ice_config_t *config)
{
    char *bindaddress = NULL;
    struct cfg_tag icecast_tags[] =
    {
        { "location",           config_get_str,     &config->location },
        { "admin",              config_get_str,     &config->admin },
        { "server_id",          config_get_str,     &config->server_id },
        { "server-id",          config_get_str,     &config->server_id },
        { "source-password",    config_get_str,     &config->source_password },
        { "hostname",           config_get_str,     &config->hostname },
        { "port",               config_get_int,     &config->port },
        { "bind-address",       config_get_str,     &bindaddress },
        { "fileserve",          config_get_bool,    &config->fileserve },
        { "relays-on-demand",   config_get_bool,    &config->on_demand },
        { "master-server",      config_get_str,     &config->master_server },
        { "master-username",    config_get_str,     &config->master_username },
        { "master-password",    config_get_str,     &config->master_password },
        { "master-bind",        config_get_str,     &config->master_bind },
        { "master-server-port", config_get_int,     &config->master_server_port },
        { "master-update-interval",
                                config_get_int,     &config->master_update_interval },
        { "master-relay-auth",  config_get_bool,    &config->master_relay_auth },
        { "master-ssl-port",    config_get_int,     &config->master_ssl_port },
        { "master-redirect",    config_get_bool,    &config->master_redirect },
        { "max-redirect-slaves",config_get_int,     &config->max_redirects },
        { "redirect",           _parse_redirect,    config },
        { "shoutcast-mount",    config_get_str,     &config->shoutcast_mount },
        { "listen-socket",      _parse_listen_sock, config },
        { "limits",             _parse_limits,      config },
        { "relay",              _parse_relay,       config },
        { "mount",              _parse_mount,       config },
        { "master",             _parse_master,      config },
        { "directory",          _parse_directory,   config },
        { "paths",              _parse_paths,       config },
        { "logging",            _parse_logging,     config },
        { "security",           _parse_security,    config },
        { "authentication",     _parse_authentication, config},
        { NULL, NULL, NULL }
    };

    config->master_relay_auth = 1;
    if (parse_xml_tags (node, icecast_tags))
        return -1;

    if (config->max_redirects == 0 && config->master_redirect)
        config->max_redirects = 1;
    if (config->listen_sock_count == 0)
    {
        if (config->port)
        {
            listener_t *listener = calloc (1, sizeof(listener_t));
            listener->refcount = 1;
            listener->port = config->port;
            listener->qlen = ICE_LISTEN_QUEUE;
            listener->bind_address = (char*)xmlStrdup (XMLSTR(bindaddress));
            listener->next = config->listen_sock;
            config->listen_sock = listener;
            config->listen_sock_count++;
        }
        else
        {
            WARN0 ("No listen-socket defintions");
            return -1;
        }
    }
    return 0;
}
Exemplo n.º 11
0
static int _parse_relay (xmlNodePtr node, void *arg)
{
    ice_config_t *config = arg;
    relay_server *relay = calloc(1, sizeof(relay_server));
    relay_server_host *host = calloc (1, sizeof (relay_server_host));
    int on_demand = config->on_demand, icy_metadata = 1, running = 1;

    struct cfg_tag icecast_tags[] =
    {
        { "master",                     _relay_host,        relay },
        { "host",                       _relay_host,        relay },
        { "server",                     config_get_str,     &host->ip },
        { "ip",                         config_get_str,     &host->ip },
        { "bind",                       config_get_str,     &host->bind },
        { "port",                       config_get_port,    &host->port },
        { "mount",                      config_get_str,     &host->mount },
        { "timeout",                    config_get_int,     &host->timeout },
        { "local-mount",                config_get_str,     &relay->localmount },
        { "on-demand",                  config_get_bool,    &on_demand },
        { "run-on",                     config_get_int,     &relay->run_on },
        { "retry-delay",                config_get_int,     &relay->interval },
        { "relay-icy-metadata",         config_get_bool,    &icy_metadata },
        { "relay-shoutcast-metadata",   config_get_bool,    &icy_metadata },
        { "username",                   config_get_str,     &relay->username },
        { "password",                   config_get_str,     &relay->password },
        { "enable",                     config_get_bool,    &running },
        { NULL, NULL, NULL },
    };

    relay->interval = config->master_update_interval;
    relay->run_on = 30;
    relay->hosts = host;
    /* default settings */
    host->port = config->port;
    host->ip = (char *)xmlCharStrdup ("127.0.0.1");
    host->mount = (char*)xmlCharStrdup ("/");
    host->timeout = 4;

    if (parse_xml_tags (node, icecast_tags))
        return -1;

    if (on_demand)      relay->flags |= RELAY_ON_DEMAND;
    if (icy_metadata)   relay->flags |= RELAY_ICY_META;
    if (running)        relay->flags |= RELAY_RUNNING;

    /* check for unspecified entries */
    if (relay->localmount == NULL)
        relay->localmount = (char*)xmlCharStrdup (host->mount);

    /* if master is set then remove the default entry at the head of the list */ 
    if (relay->hosts->next)
    {
        relay->hosts = relay->hosts->next;
        if (host->mount)  xmlFree (host->mount);
        if (host->ip)     xmlFree (host->ip);
        if (host->bind)   xmlFree (host->bind);
        free (host);
    }

    relay->new_details = config->relays;
    config->relays = relay;

    return 0;
}