diff --git a/inc/lektor/common.h b/inc/lektor/common.h index ebb7faabb2356896afd2c17fd0c5f8a8b32745e5..64abaa2848b089c41dae60292094de547d4c9b77 100644 --- a/inc/lektor/common.h +++ b/inc/lektor/common.h @@ -7,10 +7,11 @@ /* Defines */ -#define URL_MAX_LEN 1024 -#define DEFAULT_URL "https://kurisu.iiens.net" -#define GET_ID_JSON DEFAULT_URL "/api_karas.php?id=%ld" -#define GET_ID_FILE DEFAULT_URL "/download.php?id=%ld" +#define INI_MAX_LINE_LEN 1024 +#define URL_MAX_LEN 1024 +#define DEFAULT_URL "https://kurisu.iiens.net" +#define GET_ID_JSON DEFAULT_URL "/api_karas.php?id=%ld" +#define GET_ID_FILE DEFAULT_URL "/download.php?id=%ld" #define SELF_EXECUTABLE_LINUX "/proc/self/exe" #define SELF_EXECUTABLE_FREEBSD "/proc/curproc/file" diff --git a/src/config.c b/src/config.c index cfc6e2b3eaef579628ad42f7a251ba7be3880aeb..30fb19a79ef052e92af0cf8948403fd9847591b7 100644 --- a/src/config.c +++ b/src/config.c @@ -1,9 +1,9 @@ #define _POSIX_C_SOURCE 200809L #include <common/common.h> +#include <lektor/common.h> #include <lektor/config.h> #include <lektor/database.h> -#include <ini/ini.h> #include <stdlib.h> #include <errno.h> #include <string.h> @@ -14,6 +14,71 @@ #include <sys/types.h> #include <sys/stat.h> #include <limits.h> +#include <ctype.h> + +typedef int (*ini_handler)(volatile sqlite3 *db, const char *section, const char *name, const char *value); + +static inline char * +strip(char *s) +{ + char *p = s + strlen(s); + while (p > s && isspace(*(--p))) + *p = 0; + return s; +} + +static inline char * +skip(char *s) +{ + while (*s && isspace(*s)) + s++; + return s; +} + +static inline int +ini_parse(const char *path, ini_handler handle, volatile sqlite3 *db) +{ + char line[INI_MAX_LINE_LEN], *start, *end, *name, *value; + int error = 1, linenum = 0; + FILE *file = fopen(path, "r"); + if (!file) { + LOG_ERROR_SCT("PARSER", "Failed to open config file '%s'", path); + return 1; + } + + /* Parse the file */ + while (NULL != fgets(line, INI_MAX_LINE_LEN, file)) { + ++linenum; + start = skip(strip(line)); + + /* Skip comments */ + if (strspn(start, ";#")) + continue; + + /* Handle sections */ + else if (start[0] == '[') { + end = &start[1 + strcspn(start + 1, "]")]; + if (end[0] == ']') { + } + + else { + LOG_ERROR_SCT("PARSER", "Invalid section name at line '%d'", linenum); + } + } + + /* Handle others */ + else if (start[0]) { + } + } + + /* End of the function */ + error = 0; +error: + fclose(file); + if (error) + LOG_ERROR_SCT("PARSER", "An error occured while parsing the file '%s'", path); + return error; +} int load_so(const char *const mod_path, const char *const mod_init, void *mod) @@ -67,7 +132,6 @@ validate_conf(volatile sqlite3 *db) } CHK_OPTION("externals", "mkvpropedit"); - CHK_OPTION("externals", "sqlite3"); CHK_OPTION("server", "host"); CHK_OPTION("server", "port"); @@ -87,14 +151,8 @@ validate_conf(volatile sqlite3 *db) } static int -#if INI_HANDLER_LINENO -handler(void *user, const char *section, const char *name, const char *value, int lineno) -{ - UNUSED(lineno); -#else -handler(void *user, const char *section, const char *name, const char *value) +handler(volatile sqlite3 *user, const char *section, const char *name, const char *value) { -#endif RETURN_UNLESS(section && name && value, "I can't complete the database with incomplete lines", 1); RETURN_UNLESS(database_config_set(user, section, name, value), "Failed to update the database", 0); return 1; @@ -166,7 +224,7 @@ found: int config_new(volatile sqlite3 *db, const char *conf) { - if (ini_parse(conf, handler, (void *) db)) { + if (ini_parse(conf, handler, db)) { LOG_ERROR("Failed to parse file %s", conf); return 1; } diff --git a/src/ini/ini.c b/src/ini/ini.c index 25e3870318e7efb1201ff8e3831067e1777f7e1e..5329bcc977c980652b35607d57b2807bda516e63 100644 --- a/src/ini/ini.c +++ b/src/ini/ini.c @@ -110,48 +110,14 @@ ini_parse_stream(ini_reader reader, void *stream, ini_handler handler, /* Scan through stream line by line */ while (reader(line, (int)max_line, stream) != NULL) { -#if INI_ALLOW_REALLOC && !INI_USE_STACK - offset = strlen(line); - while (offset == max_line - 1 && line[offset - 1] != '\n') { - max_line *= 2; - if (max_line > INI_MAX_LINE) - max_line = INI_MAX_LINE; - new_line = realloc(line, max_line); - if (!new_line) { - free(line); - return -2; - } - line = new_line; - if (reader(line + offset, (int)(max_line - offset), stream) == NULL) - break; - if (max_line >= INI_MAX_LINE) - break; - offset += strlen(line + offset); - } -#endif - lineno++; start = line; -#if INI_ALLOW_BOM - if (lineno == 1 && (unsigned char)start[0] == 0xEF && - (unsigned char)start[1] == 0xBB && - (unsigned char)start[2] == 0xBF) - start += 3; -#endif start = lskip(rstrip(start)); if (strchr(INI_START_COMMENT_PREFIXES, *start)) { /* Start-of-line comment */ } -#if INI_ALLOW_MULTILINE - else if (*prev_name && *start && start > line) { - /* Non-blank line with leading whitespace, treat as continuation - of previous name's value (as per Python configparser). */ - if (!HANDLER(user, section, prev_name, start) && !error) - error = lineno; - } -#endif else if (*start == '[') { /* A "[section]" line */ end = find_chars_or_comment(start + 1, "]"); @@ -159,10 +125,6 @@ ini_parse_stream(ini_reader reader, void *stream, ini_handler handler, *end = '\0'; strncpy0(section, start + 1, sizeof(section)); *prev_name = '\0'; -#if INI_CALL_HANDLER_ON_NEW_SECTION - if (!HANDLER(user, section, NULL, NULL) && !error) - error = lineno; -#endif } else if (!error) { /* No ']' found on section line */ error = lineno; @@ -188,14 +150,7 @@ ini_parse_stream(ini_reader reader, void *stream, ini_handler handler, error = lineno; } else if (!error) { /* No '=' or ':' found on name[=:]value line */ -#if INI_ALLOW_NO_VALUE - *end = '\0'; - name = rstrip(start); - if (!HANDLER(user, section, name, NULL) && !error) - error = lineno; -#else error = lineno; -#endif } } @@ -205,10 +160,6 @@ ini_parse_stream(ini_reader reader, void *stream, ini_handler handler, #endif } -#if !INI_USE_STACK - free(line); -#endif - return error; }