From: Steinar H. Gunderson Date: Thu, 11 Apr 2013 23:56:12 +0000 (+0200) Subject: Add rudimentary README. X-Git-Tag: 1.0.0~142 X-Git-Url: https://git.sesse.net/?p=cubemap;a=commitdiff_plain;h=32d84e70aa1f1c9cd8334aceac0a617b4a7b4b40 Add rudimentary README. --- diff --git a/Makefile b/Makefile index bc3511a..f99e226 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ PROTOC=protoc CXXFLAGS=-Wall -O2 -g LDLIBS=-lpthread -lprotobuf -OBJS=main.o server.o serverpool.o mutexlock.o input.o httpinput.o udpinput.o parse.o markpool.o acceptor.o stats.o thread.o state.pb.o +OBJS=main.o server.o serverpool.o mutexlock.o input.o httpinput.o udpinput.o parse.o config.o markpool.o acceptor.o stats.o thread.o state.pb.o all: cubemap diff --git a/README b/README new file mode 100644 index 0000000..06c1c64 --- /dev/null +++ b/README @@ -0,0 +1,7 @@ +Cubemap is a high-performance, high-availaility video reflector, +specifically made for use with VLC. + +Copyright 2013 Steinar H. Gunderson . +Licensed under the GNU GPL, version 2. + +More information to come here, later. :-) diff --git a/main.cpp b/main.cpp index d77fb2e..907be07 100644 --- a/main.cpp +++ b/main.cpp @@ -19,6 +19,7 @@ #include #include "acceptor.h" +#include "config.h" #include "markpool.h" #include "metacube.h" #include "parse.h" diff --git a/parse.cpp b/parse.cpp index d8706d3..eed7d19 100644 --- a/parse.cpp +++ b/parse.cpp @@ -58,120 +58,6 @@ vector split_lines(const string &str) return ret; } -vector parse_config(const string &filename) -{ - vector ret; - - FILE *fp = fopen(filename.c_str(), "r"); - if (fp == NULL) { - perror(filename.c_str()); - exit(1); - } - - char buf[4096]; - while (!feof(fp)) { - if (fgets(buf, sizeof(buf), fp) == NULL) { - break; - } - - // Chop off the string at the first #, \r or \n. - buf[strcspn(buf, "#\r\n")] = 0; - - // Remove all whitespace from the end of the string. - size_t len = strlen(buf); - while (len > 0 && isspace(buf[len - 1])) { - buf[--len] = 0; - } - - // If the line is now all blank, ignore it. - if (len == 0) { - continue; - } - - vector tokens = split_tokens(buf); - assert(!tokens.empty()); - - ConfigLine line; - line.keyword = tokens[0]; - - for (size_t i = 1; i < tokens.size(); ++i) { - // foo=bar is a parameter; anything else is an argument. - size_t equals_pos = tokens[i].find_first_of('='); - if (equals_pos == string::npos) { - line.arguments.push_back(tokens[i]); - } else { - string key = tokens[i].substr(0, equals_pos); - string value = tokens[i].substr(equals_pos + 1, string::npos); - line.parameters.insert(make_pair(key, value)); - } - } - - ret.push_back(line); - } - - fclose(fp); - return ret; -} - -string fetch_config_string(const vector &config, const string &keyword, - ParameterType parameter_type, const string &default_value) -{ - assert(parameter_type == PARAMATER_MANDATORY || parameter_type == PARAMETER_OPTIONAL); - for (unsigned i = 0; i < config.size(); ++i) { - if (config[i].keyword != keyword) { - continue; - } - if (config[i].parameters.size() > 0 || - config[i].arguments.size() != 1) { - fprintf(stderr, "ERROR: '%s' takes one argument and no parameters\n", keyword.c_str()); - exit(1); - } - return config[i].arguments[0]; - } - if (parameter_type == PARAMATER_MANDATORY) { - fprintf(stderr, "ERROR: Missing '%s' statement in config file.\n", - keyword.c_str()); - exit(1); - } else { - return default_value; - } -} - -int fetch_config_int(const std::vector &config, const std::string &keyword, - int min_limit, int max_limit, - ParameterType parameter_type, int default_value) -{ - assert(parameter_type == PARAMATER_MANDATORY || parameter_type == PARAMETER_OPTIONAL); - bool value_found = false; - int value = -1; - for (unsigned i = 0; i < config.size(); ++i) { - if (config[i].keyword != keyword) { - continue; - } - if (config[i].parameters.size() > 0 || - config[i].arguments.size() != 1) { - fprintf(stderr, "ERROR: '%s' takes one argument and no parameters\n", keyword.c_str()); - exit(1); - } - value_found = true; - value = atoi(config[i].arguments[0].c_str()); // TODO: verify int validity. - } - if (!value_found) { - if (parameter_type == PARAMETER_OPTIONAL) { - return default_value; - } - fprintf(stderr, "ERROR: Missing '%s' statement in config file.\n", - keyword.c_str()); - exit(1); - } - if (value < min_limit || value > max_limit) { - fprintf(stderr, "ERROR: '%s' is set to %d, must be in [%d,%d]\n", - keyword.c_str(), value, min_limit, max_limit); - exit(1); - } - return value; -} - #define MAX_REQUEST_SIZE 16384 /* 16 kB. */ RequestParseStatus wait_for_double_newline(string *existing_data, const char *new_data, size_t new_data_size) diff --git a/parse.h b/parse.h index 3cfa091..6912dd9 100644 --- a/parse.h +++ b/parse.h @@ -1,40 +1,17 @@ #ifndef _PARSE_H #define _PARSE_H -// Various routines that deal with parsing; both configuration files and HTTP requests. +// Various routines that deal with parsing; both HTTP requests and more generic text. -#include #include #include -struct ConfigLine { - std::string keyword; - std::vector arguments; - std::map parameters; -}; - // Split a line on whitespace, e.g. "foo bar baz" -> {"foo", "bar", "baz"}. std::vector split_tokens(const std::string &line); // Split a string on \n or \r\n, e.g. "foo\nbar\r\n\nbaz\r\n\r\n" -> {"foo", "bar", "baz"}. std::vector split_lines(const std::string &str); -// Parse the configuration file. -std::vector parse_config(const std::string &filename); - -enum ParameterType { - PARAMETER_OPTIONAL, - PARAMATER_MANDATORY, -}; - -std::string fetch_config_string(const std::vector &config, const std::string &keyword, - ParameterType parameter_type, const std::string &default_value = ""); - -// Note: Limits are inclusive. -int fetch_config_int(const std::vector &config, const std::string &keyword, - int min_limit, int max_limit, - ParameterType parameter_type, int default_value = -1); - // Add the new data to an existing string, looking for \r\n\r\n // (typical of HTTP requests and/or responses). Will return one // of the given statuses.