diff --git a/src/guacd/conf-file.c b/src/guacd/conf-file.c index 002e883c..eaad192d 100644 --- a/src/guacd/conf-file.c +++ b/src/guacd/conf-file.c @@ -25,13 +25,71 @@ #include "conf-file.h" #include "conf-parse.h" +#include +#include #include #include +#include + +#include +#include +#include + +/** + * Updates the configuration with the given parameter/value pair, flagging + * errors as necessary. + */ +static int guacd_conf_callback(const char* section, const char* param, const char* value, void* data) { + fprintf(stderr, "%s: %s: %s\n", section, param, value); + return 0; +} int guacd_conf_parse_file(guacd_config* conf, int fd) { - /* STUB */ + int line = 1; + char* line_start; + int parsed = 0; + + char buffer[8192]; + int chars_read; + int length = 0; + + /* Attempt to fill remaining space in buffer */ + while ((chars_read = read(fd, buffer + length, sizeof(buffer) - length)) > 0) { + + length += chars_read; + + line_start = buffer; + + /* Attempt to parse entire buffer */ + while ((parsed = guacd_parse_conf(guacd_conf_callback, line_start, length, conf)) > 0) { + line_start += parsed; + length -= parsed; + line++; + } + + /* Shift contents to front */ + memmove(buffer, line_start, length); + + } + + /* Handle parse errors */ + if (parsed < 0) { + int column = guacd_conf_parse_error_location - line_start + 1; + fprintf(stderr, "Parse error at line %i, column %i: %s.\n", + line, column, guacd_conf_parse_error); + return 1; + } + + /* Check for error conditions */ + if (chars_read < 0) { + fprintf(stderr, "Error reading configuration: %s\n", strerror(errno)); + return 1; + } + + /* Read successfully */ return 0; + } guacd_config* guacd_conf_load() { @@ -51,6 +109,26 @@ guacd_config* guacd_conf_load() { conf->key_file = NULL; #endif + /* Read configuration from file */ + int fd = open(GUACD_CONF_FILE, O_RDONLY); + if (fd > 0) { + + int retval = guacd_conf_parse_file(conf, fd); + close(fd); + + if (retval != 0) { + fprintf(stderr, "Unable to parse \"" GUACD_CONF_FILE "\".\n"); + return NULL; + } + + } + + /* Notify of errors preventing reading */ + else if (errno != ENOENT) { + fprintf(stderr, "Unable to open \"" GUACD_CONF_FILE "\": %s\n", strerror(errno)); + return NULL; + } + return conf; } diff --git a/src/guacd/conf-file.h b/src/guacd/conf-file.h index ae8744c7..181a6dba 100644 --- a/src/guacd/conf-file.h +++ b/src/guacd/conf-file.h @@ -25,6 +25,11 @@ #include "config.h" +/** + * The location of the system-wide configuration file. + */ +#define GUACD_CONF_FILE "/etc/guacamole/guacd.conf" + /** * The contents of a guacd configuration file. */ diff --git a/src/guacd/conf-parse.c b/src/guacd/conf-parse.c index b5500a8f..59c2e43c 100644 --- a/src/guacd/conf-parse.c +++ b/src/guacd/conf-parse.c @@ -508,6 +508,12 @@ static int guacd_parse_line(guacd_param_callback* callback, char* buffer, int le } int guacd_parse_conf(guacd_param_callback* callback, char* buffer, int length, void* data) { + + /* Empty buffers are valid */ + if (length == 0) + return 0; + return guacd_parse_line(callback, buffer, length, data); + }