cconfigurationconfiglibconfig

Why is config_read_file() returning config_false?


I have been using libconfig for config files in a project. When I remove the double quotes from sources by source_to_use, config_read_file() returns config_true and also has a syntax error. The syntax error will cause my getter for the source_to_use option to go to the default case. Also because of this my getter for the source array, will also go to the else case. Could this just be me making a simple syntax error with the libconfig format?

This is the config file I am using:

#config for walld

#colors
colors = TRUE;

source_to_use: "sources";

default:
[
    "/home/seth/Pictures/kimi.png"
];

sources:
[
    "/home/seth/.walld/persona",
    "/home/seth/.walld/image-urls"
];

This is the function I have reading it:

settings* read_config(const char* config_file, const char* home_dir) {
    settings* options = malloc(sizeof(settings));

    config_t config;
    config_setting_t* setting;
    const char* source;
    int colors;

    config_init(&config);

    if (config_read_file(&config, config_file) == CONFIG_TRUE) {
        config_destroy(&config);
        return NULL;
    }

    if (config_lookup_bool(&config, "colors", &colors)) {
        options->colors = colors;
    }
    else {
        options->colors = 0;
    }

    if (config_lookup_string(&config, "source_to_use", &source)) {
        //NOP
    }
    else {
        source = "default";
    }

    setting = config_lookup(&config, source);

    if (setting != NULL) {
        int count = config_setting_length(setting);

        linked_node* entry_point = add_node_to_list(NULL, NULL);

        linked_node* current = entry_point;

        options->sources = entry_point;


        for (int i = 0; i < count; i++) {
            char* item = config_setting_get_string_elem(setting, i);

            current = add_node_to_list(current, item);
        }
    }
    else {
        options->sources = malloc(sizeof(linked_node));
        int char_count = snprintf(NULL, 0, "%s%s", home_dir, "/.walld/images");
        if (char_count <= 0) {
            //tough luck
            abort();
        }
        char* default_folder = malloc(char_count + 1U);

        if (default_folder == NULL) {
            //tough luck
            abort();
        }

        snprintf(default_folder, char_count + 1U, "%s%s", home_dir, "/.walld/images");

        options->sources->image = default_folder;
    }

    config_destroy(&config);

    return options;
}

Solution

  • In your read_config function, your first if is:

    if (config_read_file(&config, config_file) == CONFIG_TRUE) {
        config_destroy(&config);
        return NULL;
    }
    

    The sense of the if is reversed, so you'll return a NULL if the read of the file is valid.

    So, you want to reverse the sense of this if:

    if (config_read_file(&config, config_file) != CONFIG_TRUE) {
        config_destroy(&config);
        return NULL;
    }
    

    Or you could [probably] use:

    if (config_read_file(&config, config_file) == CONFIG_FALSE) {