Ejemplo n.º 1
0
void Test_iniparser_getseckeys(CuTest *tc)
{
    unsigned i;
    char key_name[64];
    dictionary *dic;
    const char ** sections;
    /* NULL test */
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(NULL, NULL));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(NULL, "dummy"));

    /* Empty dictionary */
    dic = dictionary_new(10);
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, NULL));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "dummy"));
    dictionary_del(dic);

    /* Generic dictionary */
    dic = generate_dictionary(100, 10);
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, NULL));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "dummy"));
    sections = iniparser_getseckeys(dic, "sec42");
    CuAssertPtrNotNull(tc, sections);
    for (i = 0; i < 10; ++i) {
        sprintf(key_name, "sec42:key%d", i);
        CuAssertStrEquals(tc, key_name, sections[i]);
    }
    free(sections);

    /* Remove some keys to make the dictionary more real */
    dictionary_unset(dic, "sec42");
    dictionary_unset(dic, "sec99:key9");
    dictionary_unset(dic, "sec0:key0");
    dictionary_unset(dic, "sec0:key1");
    dictionary_unset(dic, "sec0:key2");

    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "sec42"));
    sections = iniparser_getseckeys(dic, "sec99");
    CuAssertPtrNotNull(tc, sections);
    for (i = 0; i < 9; ++i) {
        sprintf(key_name, "sec99:key%d", i);
        CuAssertStrEquals(tc, key_name, sections[i]);
    }
    free(sections);
    sections = iniparser_getseckeys(dic, "sec0");
    CuAssertPtrNotNull(tc, sections);
    for (i = 0; i < 7; ++i) {
        sprintf(key_name, "sec0:key%d", i + 3);
        CuAssertStrEquals(tc, key_name, sections[i]);
    }
    free(sections);

    dictionary_del(dic);
}
Ejemplo n.º 2
0
/*--------------------------------------------------------------------------*/
void _get_keys(TSection *section)
{
	TKeys *keys = malloc(sizeof(struct sectionkeys));
	if ((keys->num = iniparser_getsecnkeys(ini, section->section_name)) == -1){
		write_to_log(WARNING, "%s - %d - %s", __LINE__, __func__, "Unable to count config section key");
		return;
	}
	keys->names = iniparser_getseckeys(ini, section->section_name);
	section->keys = keys;
	return; 
}
Ejemplo n.º 3
0
char *flib_ini_get_keyname(flib_ini *ini, int number) {
	char *result = NULL;
	if(!log_badargs_if3(ini==NULL, ini->currentSection==NULL, number<0)) {
		int keyCount = iniparser_getsecnkeys(ini->inidict, ini->currentSection);
		char **keys = iniparser_getseckeys(ini->inidict, ini->currentSection);
		if(keys && keyCount>number) {
			// The keys are in the format section:key, so we have to skip the section and colon.
			result = flib_strdupnull(keys[number]+strlen(ini->currentSection)+1);
		}
		free(keys);
	}
	return result;
}
Ejemplo n.º 4
0
void Test_iniparser_getseckeys(CuTest *tc)
{
    unsigned i;
    char key_name[64];
    dictionary *dic;
    int nkeys;
    const char * keys[10]; /* At most 10 elements per section */
    /* NULL test */
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(NULL, NULL, NULL));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(NULL, "dummy", NULL));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(NULL, "dummy", keys));

    /* Empty dictionary */
    dic = dictionary_new(10);
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, NULL, keys));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "dummy", keys));
    dictionary_del(dic);

    /* Generic dictionary */

    dic = generate_dictionary(100, 10);
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, NULL, keys));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "dummy", keys));
    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "sec0", NULL));
    nkeys = iniparser_getsecnkeys(dic, "sec42");
    CuAssertIntEquals(tc, nkeys, 10);
    CuAssertPtrEquals(tc, keys, iniparser_getseckeys(dic, "sec42", keys));
    for (i = 0; i < 10; ++i) {
        sprintf(key_name, "sec42:key%d", i);
        CuAssertStrEquals(tc, key_name, keys[i]);
    }

    /* Remove some keys to make the dictionary more real */
    dictionary_unset(dic, "sec42");
    dictionary_unset(dic, "sec99:key9");
    dictionary_unset(dic, "sec0:key0");
    dictionary_unset(dic, "sec0:key1");
    dictionary_unset(dic, "sec0:key2");

    CuAssertPtrEquals(tc, NULL, iniparser_getseckeys(dic, "sec42", keys));
    nkeys = iniparser_getsecnkeys(dic, "sec99");
    CuAssertIntEquals(tc, nkeys, 9);
    CuAssertPtrEquals(tc, keys, iniparser_getseckeys(dic, "sec99", keys));
    for (i = 0; i < 9; ++i) {
        sprintf(key_name, "sec99:key%d", i);
        CuAssertStrEquals(tc, key_name, keys[i]);
    }

    nkeys = iniparser_getsecnkeys(dic, "sec0");
    CuAssertIntEquals(tc, nkeys, 7);
    CuAssertPtrEquals(tc, keys, iniparser_getseckeys(dic, "sec0", keys));
    for (i = 0; i < 7; ++i) {
        sprintf(key_name, "sec0:key%d", i + 3);
        CuAssertStrEquals(tc, key_name, keys[i]);
    }

    dictionary_del(dic);
}
Ejemplo n.º 5
0
int gen_pia(dictionary *ini, char **pia_data)
{
    struct product_info_area *pia;

    char *data,
         *str_data,
         *packed_ascii,
         *mfg_packed,
         *name_packed,
         *part_num_packed,
         *version_packed,
         *serial_num_packed,
         *asset_tag_packed,
         *key,
         **sec_keys;

    int lang_code,
        size,
        offset,
        mfg_size,
        name_size,
        part_num_size,
        version_size,
        serial_num_size,
        asset_tag_size,
        packed_size,
        num_keys,
        i;

    uint8_t end_marker, empty_marker, cksum;

    pia = NULL;
    size = offset = cksum = empty_marker = 0;
    end_marker = 0xc1;

    lang_code = iniparser_getint(ini, get_key(PIA, LANGUAGE_CODE), -1);
    if (lang_code == -1) {
        fprintf(stdout, "Product language code not specified. "
                "Defaulting to English\n");
        lang_code = 0;
    }
    size += sizeof(struct product_info_area);

    str_data = iniparser_getstring(ini, get_key(PIA, MANUFACTURER), NULL);
    if (str_data && strlen(str_data)) {
        mfg_size = (*packer)(str_data, &mfg_packed);
        size += mfg_size;
    } else {
        mfg_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(PIA, PRODUCT_NAME), NULL);
    if (str_data && strlen(str_data)) {
        name_size = (*packer)(str_data, &name_packed);
        size += name_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        name_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(PIA, PART_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        part_num_size = (*packer)(str_data, &part_num_packed);
        size += part_num_size;
    } else {
        part_num_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(PIA, VERSION), NULL);
    if (str_data && strlen(str_data)) {
        version_size = (*packer)(str_data, &version_packed);
        size += version_size;
    } else {
        version_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(PIA, SERIAL_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        serial_num_size = (*packer)(str_data, &serial_num_packed);
        size += serial_num_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        serial_num_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(PIA, ASSET_TAG), NULL);
    if (str_data && strlen(str_data)) {
        asset_tag_size = (*packer)(str_data, &asset_tag_packed);
        size += asset_tag_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        asset_tag_packed = NULL;
        size += 1;
    }
    /* We don't handle FRU File ID for now... */
    size += 1;

    num_keys = iniparser_getsecnkeys(ini, PIA);
    sec_keys = iniparser_getseckeys(ini, PIA);

    /* first iteration calculates the amount of space needed */
    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(PIA, LANGUAGE_CODE)) ||
            !strcmp(key, get_key(PIA, MANUFACTURER)) ||
            !strcmp(key, get_key(PIA, PRODUCT_NAME)) ||
            !strcmp(key, get_key(PIA, PART_NUMBER)) ||
            !strcmp(key, get_key(PIA, VERSION)) ||
            !strcmp(key, get_key(PIA, SERIAL_NUMBER)) ||
            !strcmp(key, get_key(PIA, ASSET_TAG)) ||
            !strcmp(key, get_key(PIA, FRU_FILE_ID))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            size += (*packer)(str_data, &packed_ascii);
        }
    }

    size = get_aligned_size(size + 2, 8);

    data = (char *) calloc(size, 1);
    pia = (struct product_info_area *) data;

    /* Fill up PIA */
    pia->format_version = 0x01;
    /* Length is in multiples of 8 bytes */
    pia->area_length = size / 8;
    pia->language_code = lang_code;

    if (mfg_packed) {
        memcpy(pia->tl + offset, mfg_packed, mfg_size);
        offset += mfg_size;
    } else {
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (name_packed) {
        memcpy(pia->tl + offset, name_packed, name_size);
        offset += name_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (part_num_packed) {
        memcpy(pia->tl + offset, part_num_packed, part_num_size);
        offset += part_num_size;
    } else {
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (version_packed) {
        memcpy(pia->tl + offset, version_packed, version_size);
        offset += version_size;
    } else {
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (serial_num_packed) {
        memcpy(pia->tl + offset, serial_num_packed, serial_num_size);
        offset += serial_num_size;
    } else {
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (asset_tag_packed) {
        memcpy(pia->tl + offset, asset_tag_packed, asset_tag_size);
        offset += asset_tag_size;
    } else {
        memcpy(pia->tl + offset, &empty_marker, 1);
        offset += 1;
    }
    /* We don't handle FRU File ID for now... */
    memcpy(pia->tl + offset, &empty_marker, 1);
    offset += 1;

    /* Second iteration copies packed contents into final buffer */
    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(PIA, LANGUAGE_CODE)) ||
            !strcmp(key, get_key(PIA, MANUFACTURER)) ||
            !strcmp(key, get_key(PIA, PRODUCT_NAME)) ||
            !strcmp(key, get_key(PIA, PART_NUMBER)) ||
            !strcmp(key, get_key(PIA, VERSION)) ||
            !strcmp(key, get_key(PIA, SERIAL_NUMBER)) ||
            !strcmp(key, get_key(PIA, ASSET_TAG)) ||
            !strcmp(key, get_key(PIA, FRU_FILE_ID))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            packed_size = (*packer)(str_data, &packed_ascii);
            memcpy(pia->tl + offset, packed_ascii, packed_size);
            offset += packed_size;
        }
    }
    /* write the end marker 'C1' */
    memcpy(pia->tl + offset, &end_marker, 1);
    /* Calculate checksum of entire PIA */
    cksum = get_zero_cksum((uint8_t *)data, size-1);
    memcpy(data+size-1, &cksum, 1);

    *pia_data = data;

    return pia->area_length;
}
Ejemplo n.º 6
0
int gen_bia(dictionary *ini, char **bia_data)
{
    struct board_info_area *bia;

    char *data,
         *str_data,
         *packed_ascii,
         *mfg_packed,
         *name_packed,
         *serial_num_packed,
         *part_num_packed,
         *key,
         **sec_keys;

    int lang_code,
        mfg_date,
        size,
        offset,
        mfg_size,
        name_size,
        serial_num_size,
        part_num_size,
        num_keys,
        packed_size,
        i;

    uint8_t end_marker, empty_marker, cksum;

    bia = NULL;
    size = offset = cksum = empty_marker = 0;
    end_marker = 0xc1;

    lang_code = iniparser_getint(ini, get_key(BIA, LANGUAGE_CODE), -1);
    if (lang_code == -1) {
        fprintf(stdout, "Board language code not specified. "
                "Defaulting to English\n");
        lang_code = 0;
    }

    mfg_date = iniparser_getint(ini, get_key(BIA, MFG_DATETIME), -1);
    if (mfg_date == -1) {
        fprintf(stdout, "Manufacturing time not specified. "
                "Defaulting to unspecified\n");
        mfg_date = 0;
    }
    size += sizeof(struct board_info_area);

    str_data = iniparser_getstring(ini, get_key(BIA, MANUFACTURER), NULL);
    if (str_data && strlen(str_data)) {
        mfg_size = (*packer)(str_data, &mfg_packed);
        size += mfg_size;
    } else {
        mfg_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(BIA, PRODUCT_NAME), NULL);
    if (str_data && strlen(str_data)) {
        name_size = (*packer)(str_data, &name_packed);
        size += name_size;
    } else {
        name_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(BIA, SERIAL_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        serial_num_size = (*packer)(str_data, &serial_num_packed);
        size += serial_num_size;
    } else {
        serial_num_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(BIA, PART_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        part_num_size = (*packer)(str_data, &part_num_packed);
        size += part_num_size;
    } else {
        part_num_packed = NULL;
        size += 1;
    }
    /* We don't handle FRU File ID for now... */
    size += 1;

    num_keys = iniparser_getsecnkeys(ini, BIA);
    sec_keys = iniparser_getseckeys(ini, BIA);

    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(BIA, LANGUAGE_CODE)) ||
            !strcmp(key, get_key(BIA, MFG_DATETIME)) ||
            !strcmp(key, get_key(BIA, MANUFACTURER)) ||
            !strcmp(key, get_key(BIA, PRODUCT_NAME)) ||
            !strcmp(key, get_key(BIA, SERIAL_NUMBER)) ||
            !strcmp(key, get_key(BIA, PART_NUMBER)) ||
            !strcmp(key, get_key(BIA, FRU_FILE_ID))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            size += (*packer)(str_data, &packed_ascii);
        }
    }

    size = get_aligned_size(size + 2, 8);

    data = (char *) calloc(size, 1);
    bia = (struct board_info_area *) data;

    /* Fill up BIA */
    bia->format_version = 0x01;
    /* Length is in multiples of 8 bytes */
    bia->area_length = size / 8;
    bia->language_code = lang_code;
    mfg_date = htole32(mfg_date);
    memcpy(bia->mfg_date, &mfg_date, 3);

    if (mfg_packed) {
        memcpy(bia->tl + offset, mfg_packed, mfg_size);
        offset += mfg_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        memcpy(bia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (name_packed) {
        memcpy(bia->tl + offset, name_packed, name_size);
        offset += name_size;
    } else {
        memcpy(bia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (serial_num_packed) {
        memcpy(bia->tl + offset, serial_num_packed, serial_num_size);
        offset += serial_num_size;
    } else {
        memcpy(bia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (part_num_packed) {
        memcpy(bia->tl + offset, part_num_packed, part_num_size);
        offset += part_num_size;
    } else {
        memcpy(bia->tl + offset, &empty_marker, 1);
        offset += 1;
    }
    /* We don't handle FRU File ID for now... */
    memcpy(bia->tl + offset, &empty_marker, 1);
    offset += 1;

    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(BIA, LANGUAGE_CODE)) ||
            !strcmp(key, get_key(BIA, MFG_DATETIME)) ||
            !strcmp(key, get_key(BIA, MANUFACTURER)) ||
            !strcmp(key, get_key(BIA, PRODUCT_NAME)) ||
            !strcmp(key, get_key(BIA, SERIAL_NUMBER)) ||
            !strcmp(key, get_key(BIA, PART_NUMBER)) ||
            !strcmp(key, get_key(BIA, FRU_FILE_ID))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            packed_size = (*packer)(str_data, &packed_ascii);
            memcpy(bia->tl + offset, packed_ascii, packed_size);
            offset += packed_size;
        }
    }
    /* write the end marker 'C1' */
    memcpy(bia->tl + offset, &end_marker, 1);
    /* Calculate checksum of entire BIA */
    cksum = get_zero_cksum((uint8_t *) data, size-1);
    memcpy(data+size-1, &cksum, 1);

    *bia_data = data;

    return bia->area_length;
}
Ejemplo n.º 7
0
int gen_cia(dictionary *ini, char **cia_data)
{
    struct chassis_info_area *cia;
    char *data,
         *str_data,
         *packed_ascii,
         *key,
         **sec_keys,
         *part_num_packed,
         *serial_num_packed;

    int chassis_type,
        size,
        offset,
        num_keys,
        part_num_size,
        serial_num_size,
        packed_size,
        i;

    uint8_t end_marker, empty_marker, cksum;

    cia = NULL;
    size = offset = cksum = empty_marker = 0;
    end_marker = 0xc1;

    chassis_type = iniparser_getint(ini, get_key(CIA, CHASSIS_TYPE), 0);
    if (!chassis_type) {
        /* 0 is an illegal chassis type */
        fprintf(stderr, "\nInvalid chassis type! Aborting\n\n");
        exit(EXIT_FAILURE);
    }
    size += sizeof(struct chassis_info_area);

    str_data = iniparser_getstring(ini, get_key(CIA, PART_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        part_num_size = (*packer)(str_data, &part_num_packed);
        size += part_num_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        part_num_packed = NULL;
        size += 1;
    }

    str_data = iniparser_getstring(ini, get_key(CIA, SERIAL_NUMBER), NULL);
    if (str_data && strlen(str_data)) {
        serial_num_size = (*packer)(str_data, &serial_num_packed);
        size += serial_num_size;
    } else {
        serial_num_packed = NULL;
        size += 1;
    }

    num_keys = iniparser_getsecnkeys(ini, CIA);
    sec_keys = iniparser_getseckeys(ini, CIA);

    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(CIA, CHASSIS_TYPE)) ||
            !strcmp(key, get_key(CIA, PART_NUMBER)) ||
            !strcmp(key, get_key(CIA, SERIAL_NUMBER))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            size += (*packer)(str_data, &packed_ascii);
        }
    }

    /* 2 bytes added for chksum & and end marker */
    size = get_aligned_size(size + 2, 8);

    data = (char *) calloc(size, 1);
    cia = (struct chassis_info_area *) data;

    /* Fill up CIA */
    cia->format_version = 0x01;
    /* Length is in multiples of 8 bytes */
    cia->area_length = size / 8;
    cia->chassis_type = chassis_type;

    if (part_num_packed) {
        memcpy(cia->tl + offset, part_num_packed, part_num_size);
        offset += part_num_size;
    } else {
        /* predfined fields with no data take 1 byte (for type/length) */
        memcpy(cia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    if (serial_num_packed) {
        memcpy(cia->tl + offset, serial_num_packed, serial_num_size);
        offset += serial_num_size;
    } else {
        memcpy(cia->tl + offset, &empty_marker, 1);
        offset += 1;
    }

    for (i = 0; i < num_keys; i++) {
        key = sec_keys[i];
        /* Skip keys we've already accounted for */
        if (!strcmp(key, get_key(CIA, CHASSIS_TYPE)) ||
            !strcmp(key, get_key(CIA, PART_NUMBER)) ||
            !strcmp(key, get_key(CIA, SERIAL_NUMBER))) {
            continue;
        }
        str_data = iniparser_getstring(ini, key, NULL);
        if (str_data && strlen(str_data)) {
            packed_size = (*packer)(str_data, &packed_ascii);
            memcpy(cia->tl + offset, packed_ascii, packed_size);
            offset += packed_size;
        }
    }

    /* write the end marker 'C1' */
    memcpy(cia->tl + offset, &end_marker, 1);
    /* Calculate checksum of entire CIA */
    cksum = get_zero_cksum((uint8_t *) data, size-1);
    memcpy(data+size-1, &cksum, 1);

    *cia_data = data;

    return cia->area_length;
}
Ejemplo n.º 8
0
void load_config(char configPath[255], char supportedInput[255], void* params)
{

struct config_params *p = (struct config_params *)params;
FILE *fp;
	
//config: creating path to default config file
if (configPath[0] == '\0') {
	char *configFile = "config";
	char *configHome = getenv("XDG_CONFIG_HOME");
	if (configHome != NULL) {
		sprintf(configPath,"%s/%s/", configHome, PACKAGE);
	} else {
		configHome = getenv("HOME");
		if (configHome != NULL) {
			sprintf(configPath,"%s/%s/%s/", configHome, ".config", PACKAGE);
		} else {
			printf("No HOME found (ERR_HOMELESS), exiting...");
			exit(EXIT_FAILURE);
		}
	}

	// config: create directory
	mkdir(configPath, 0777);

	// config: adding default filename file
	strcat(configPath, configFile);
	
	fp = fopen(configPath, "ab+");
	if (fp) {
		fclose(fp);
	} else {
		printf("Unable to access config '%s', exiting...\n", configPath);
		exit(EXIT_FAILURE);
	}


} else { //opening specified file

	fp = fopen(configPath, "rb+");	
	if (fp) {
		fclose(fp);
	} else {
		printf("Unable to open file '%s', exiting...\n", configPath);
		exit(EXIT_FAILURE);
	}
}

// config: parse ini
dictionary* ini;
ini = iniparser_load(configPath);

//setting fifo to defaualt if no other input modes supported
inputMethod = (char *)iniparser_getstring(ini, "input:method", "fifo"); 

//setting alsa to defaualt if supported
#ifdef ALSA
	inputMethod = (char *)iniparser_getstring(ini, "input:method", "alsa"); 
#endif

//setting pulse to defaualt if supported
#ifdef PULSE
	inputMethod = (char *)iniparser_getstring(ini, "input:method", "pulse");
#endif


#ifdef NCURSES
	outputMethod = (char *)iniparser_getstring(ini, "output:method", "ncurses");
#endif
#ifndef NCURSES
	outputMethod = (char *)iniparser_getstring(ini, "output:method", "noncurses");
#endif

p->monstercat = 1.5 * iniparser_getdouble(ini, "smoothing:monstercat", 1);
p->waves = iniparser_getint(ini, "smoothing:waves", 0);
p->integral = iniparser_getdouble(ini, "smoothing:integral", 90);
p->gravity = iniparser_getdouble(ini, "smoothing:gravity", 100);
p->ignore = iniparser_getdouble(ini, "smoothing:ignore", 0);

p->color = (char *)iniparser_getstring(ini, "color:foreground", "default");
p->bcolor = (char *)iniparser_getstring(ini, "color:background", "default");

p->gradient = iniparser_getint(ini, "color:gradient", 0);
if (p->gradient) {
	p->gradient_color_1 = (char *)iniparser_getstring(ini, "color:gradient_color_1", "#0099ff");
	p->gradient_color_2 = (char *)iniparser_getstring(ini, "color:gradient_color_2", "#ff3399");
}

p->fixedbars = iniparser_getint(ini, "general:bars", 0);
p->bw = iniparser_getint(ini, "general:bar_width", 2);
p->bs = iniparser_getint(ini, "general:bar_spacing", 1);
p->framerate = iniparser_getint(ini, "general:framerate", 60);
p->sens = iniparser_getint(ini, "general:sensitivity", 100);
p->autosens = iniparser_getint(ini, "general:autosens", 1);
p->overshoot = iniparser_getint(ini, "general:overshoot", 20);
p->lowcf = iniparser_getint(ini, "general:lower_cutoff_freq", 50);
p->highcf = iniparser_getint(ini, "general:higher_cutoff_freq", 10000);

// config: output
channels =  (char *)iniparser_getstring(ini, "output:channels", "stereo");
p->raw_target = (char *)iniparser_getstring(ini, "output:raw_target", "/dev/stdout");
data_format = (char *)iniparser_getstring(ini, "output:data_format", "binary");
p->bar_delim = (char)iniparser_getint(ini, "output:bar_delimiter", 59);
p->frame_delim = (char)iniparser_getint(ini, "output:frame_delimiter", 10);
p->ascii_range = iniparser_getint(ini, "output:ascii_max_range", 1000);
p->bit_format = iniparser_getint(ini, "output:bit_format", 16);

// read & validate: eq
p->smooth = smoothDef;
p->smcount = iniparser_getsecnkeys(ini, "eq");
if (p->smcount > 0) {
	p->customEQ = 1;
	p->smooth = malloc(p->smcount*sizeof(p->smooth));
	#ifndef LEGACYINIPARSER
	const char *keys[p->smcount];
	iniparser_getseckeys(ini, "eq", keys);
	#endif
	#ifdef LEGACYINIPARSER
	char **keys = iniparser_getseckeys(ini, "eq");
	#endif
	for (int sk = 0; sk < p->smcount; sk++) {
		p->smooth[sk] = iniparser_getdouble(ini, keys[sk], 1);
	}
} else {
	p->customEQ = 0;
	p->smcount = 64; //back to the default one
}

// config: input
p->im = 0;
if (strcmp(inputMethod, "alsa") == 0) {
	p->im = 1;
	p->audio_source = (char *)iniparser_getstring(ini, "input:source", "hw:Loopback,1");
}
if (strcmp(inputMethod, "fifo") == 0) {
	p->im = 2;
	p->audio_source = (char *)iniparser_getstring(ini, "input:source", "/tmp/mpd.fifo");
}
if (strcmp(inputMethod, "pulse") == 0) {
	p->im = 3;
	p->audio_source = (char *)iniparser_getstring(ini, "input:source", "auto");
}

validate_config(supportedInput, params);
//iniparser_freedict(ini);

}