X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=config.cpp;h=aa0f670a4b78a0607db4bf8af1d1232a14f21426;hp=cce70e927e18ba93125af303f0ac151d5c5c5e39;hb=6889a665614e926437484a556124a5ff60363568;hpb=afb6264b5c56ce9e8c85b336bd247caa55b97478 diff --git a/config.cpp b/config.cpp index cce70e9..aa0f670 100644 --- a/config.cpp +++ b/config.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -18,7 +19,7 @@ using namespace std; -#define DEFAULT_BACKLOG_SIZE 1048576 +#define DEFAULT_BACKLOG_SIZE 10485760 struct ConfigLine { string keyword; @@ -132,7 +133,10 @@ bool read_config(const string &filename, vector *lines) lines->push_back(line); } - fclose(fp); + if (fclose(fp) == EOF) { + log_perror(filename.c_str()); + return false; + } return true; } @@ -184,7 +188,7 @@ bool parse_port(const ConfigLine &line, Config *config) } AcceptorConfig acceptor; - acceptor.addr = CreateAnyAddress(port); + acceptor.addr = create_any_address(port); config->acceptors.push_back(acceptor); return true; @@ -205,60 +209,6 @@ bool parse_listen(const ConfigLine &line, Config *config) return true; } -int allocate_mark_pool(int from, int to, Config *config) -{ - int pool_index = -1; - - // Reuse mark pools if an identical one exists. - // Otherwise, check if we're overlapping some other mark pool. - for (size_t i = 0; i < config->mark_pools.size(); ++i) { - const MarkPoolConfig &pool = config->mark_pools[i]; - if (from == pool.from && to == pool.to) { - pool_index = i; - } else if ((from >= pool.from && from < pool.to) || - (to >= pool.from && to < pool.to)) { - log(WARNING, "Mark pool %d-%d partially overlaps with %d-%d, you may get duplicate marks." - "Mark pools must either be completely disjunct, or completely overlapping.", - from, to, pool.from, pool.to); - } - } - - if (pool_index != -1) { - return pool_index; - } - - // No match to existing pools. - MarkPoolConfig pool; - pool.from = from; - pool.to = to; - config->mark_pools.push_back(pool); - - return config->mark_pools.size() - 1; -} - -bool parse_mark_pool(const string &mark_str, int *from, int *to) -{ - size_t split = mark_str.find_first_of('-'); - if (split == string::npos) { - log(ERROR, "Invalid mark specification '%s' (expected 'X-Y').", - mark_str.c_str()); - return false; - } - - string from_str(mark_str.begin(), mark_str.begin() + split); - string to_str(mark_str.begin() + split + 1, mark_str.end()); - *from = atoi(from_str.c_str()); - *to = atoi(to_str.c_str()); - - if (*from <= 0 || *from >= 65536 || *to <= 0 || *to >= 65536) { - log(ERROR, "Mark pool range %d-%d is outside legal range [1,65536>.", - *from, *to); - return false; - } - - return true; -} - bool parse_stream(const ConfigLine &line, Config *config) { if (line.arguments.size() != 1) { @@ -285,6 +235,13 @@ bool parse_stream(const ConfigLine &line, Config *config) stream.backlog_size = atoi(backlog_it->second.c_str()); } + map::const_iterator prebuffer_it = line.parameters.find("force_prebuffer"); + if (prebuffer_it == line.parameters.end()) { + stream.prebuffering_bytes = 0; + } else { + stream.prebuffering_bytes = atoi(prebuffer_it->second.c_str()); + } + // Parse encoding. map::const_iterator encoding_parm_it = line.parameters.find("encoding"); if (encoding_parm_it == line.parameters.end() || @@ -297,18 +254,6 @@ bool parse_stream(const ConfigLine &line, Config *config) return false; } - // Parse marks, if so desired. - map::const_iterator mark_parm_it = line.parameters.find("mark"); - if (mark_parm_it == line.parameters.end()) { - stream.mark_pool = -1; - } else { - int from, to; - if (!parse_mark_pool(mark_parm_it->second, &from, &to)) { - return false; - } - stream.mark_pool = allocate_mark_pool(from, to, config); - } - // Parse the pacing rate, converting from kilobits to bytes as needed. map::const_iterator pacing_rate_it = line.parameters.find("pacing_rate_kbit"); if (pacing_rate_it == line.parameters.end()) { @@ -345,18 +290,6 @@ bool parse_udpstream(const ConfigLine &line, Config *config) // TODO: Verify that the URL is parseable? } - // Parse marks, if so desired. - map::const_iterator mark_parm_it = line.parameters.find("mark"); - if (mark_parm_it == line.parameters.end()) { - udpstream.mark_pool = -1; - } else { - int from, to; - if (!parse_mark_pool(mark_parm_it->second, &from, &to)) { - return false; - } - udpstream.mark_pool = allocate_mark_pool(from, to, config); - } - // Parse the pacing rate, converting from kilobits to bytes as needed. map::const_iterator pacing_rate_it = line.parameters.find("pacing_rate_kbit"); if (pacing_rate_it == line.parameters.end()) { @@ -365,6 +298,26 @@ bool parse_udpstream(const ConfigLine &line, Config *config) udpstream.pacing_rate = atoi(pacing_rate_it->second.c_str()) * 1024 / 8; } + // Parse the TTL. The same value is used for unicast and multicast. + map::const_iterator ttl_it = line.parameters.find("ttl"); + if (ttl_it == line.parameters.end()) { + udpstream.ttl = -1; + } else { + udpstream.ttl = atoi(ttl_it->second.c_str()); + } + + // Parse the multicast interface index. + map::const_iterator multicast_iface_it = line.parameters.find("multicast_output_interface"); + if (multicast_iface_it == line.parameters.end()) { + udpstream.multicast_iface_index = -1; + } else { + udpstream.multicast_iface_index = if_nametoindex(multicast_iface_it->second.c_str()); + if (udpstream.multicast_iface_index == 0) { + log(ERROR, "Interface '%s' does not exist", multicast_iface_it->second.c_str()); + return false; + } + } + config->udpstreams.push_back(udpstream); return true; }