Пример #1
0
struct rte_cfgfile *
rte_cfgfile_load(const char *filename, int flags)
{
	int allocated_sections = CFG_ALLOC_SECTION_BATCH;
	int allocated_entries = 0;
	int curr_section = -1;
	int curr_entry = -1;
	char buffer[256] = {0};
	int lineno = 0;
	struct rte_cfgfile *cfg = NULL;

	FILE *f = fopen(filename, "r");
	if (f == NULL)
		return NULL;

	cfg = malloc(sizeof(*cfg) + sizeof(cfg->sections[0]) *
		allocated_sections);
	if (cfg == NULL)
		goto error2;

	memset(cfg->sections, 0, sizeof(cfg->sections[0]) * allocated_sections);

	while (fgets(buffer, sizeof(buffer), f) != NULL) {
		char *pos = NULL;
		size_t len = strnlen(buffer, sizeof(buffer));
		lineno++;
		if ((len >= sizeof(buffer) - 1) && (buffer[len-1] != '\n')) {
			printf("Error line %d - no \\n found on string. "
					"Check if line too long\n", lineno);
			goto error1;
		}
		pos = memchr(buffer, ';', sizeof(buffer));
		if (pos != NULL) {
			*pos = '\0';
			len = pos -  buffer;
		}

		len = _strip(buffer, len);
		if (buffer[0] != '[' && memchr(buffer, '=', len) == NULL)
			continue;

		if (buffer[0] == '[') {
			/* section heading line */
			char *end = memchr(buffer, ']', len);
			if (end == NULL) {
				printf("Error line %d - no terminating '['"
					"character found\n", lineno);
				goto error1;
			}
			*end = '\0';
			_strip(&buffer[1], end - &buffer[1]);

			/* close off old section and add start new one */
			if (curr_section >= 0)
				cfg->sections[curr_section]->num_entries =
					curr_entry + 1;
			curr_section++;

			/* resize overall struct if we don't have room for more
			sections */
			if (curr_section == allocated_sections) {
				allocated_sections += CFG_ALLOC_SECTION_BATCH;
				struct rte_cfgfile *n_cfg = realloc(cfg,
					sizeof(*cfg) + sizeof(cfg->sections[0])
					* allocated_sections);
				if (n_cfg == NULL) {
					printf("Error - no more memory\n");
					goto error1;
				}
				cfg = n_cfg;
			}

			/* allocate space for new section */
			allocated_entries = CFG_ALLOC_ENTRY_BATCH;
			curr_entry = -1;
			cfg->sections[curr_section] = malloc(
				sizeof(*cfg->sections[0]) +
				sizeof(cfg->sections[0]->entries[0]) *
				allocated_entries);
			if (cfg->sections[curr_section] == NULL) {
				printf("Error - no more memory\n");
				goto error1;
			}

			snprintf(cfg->sections[curr_section]->name,
					sizeof(cfg->sections[0]->name),
					"%s", &buffer[1]);
		} else {
			/* value line */
			if (curr_section < 0) {
				printf("Error line %d - value outside of"
					"section\n", lineno);
				goto error1;
			}

			struct rte_cfgfile_section *sect =
				cfg->sections[curr_section];
			char *split[2];
			if (rte_strsplit(buffer, sizeof(buffer), split, 2, '=')
				!= 2) {
				printf("Error at line %d - cannot split "
					"string\n", lineno);
				goto error1;
			}

			curr_entry++;
			if (curr_entry == allocated_entries) {
				allocated_entries += CFG_ALLOC_ENTRY_BATCH;
				struct rte_cfgfile_section *n_sect = realloc(
					sect, sizeof(*sect) +
					sizeof(sect->entries[0]) *
					allocated_entries);
				if (n_sect == NULL) {
					printf("Error - no more memory\n");
					goto error1;
				}
				sect = cfg->sections[curr_section] = n_sect;
			}

			sect->entries[curr_entry] = malloc(
				sizeof(*sect->entries[0]));
			if (sect->entries[curr_entry] == NULL) {
				printf("Error - no more memory\n");
				goto error1;
			}

			struct rte_cfgfile_entry *entry = sect->entries[
				curr_entry];
			snprintf(entry->name, sizeof(entry->name), "%s",
				split[0]);
			snprintf(entry->value, sizeof(entry->value), "%s",
				split[1]);
			_strip(entry->name, strnlen(entry->name,
				sizeof(entry->name)));
			_strip(entry->value, strnlen(entry->value,
				sizeof(entry->value)));
		}
	}
	fclose(f);
	cfg->flags = flags;
	cfg->num_sections = curr_section + 1;
	/* curr_section will still be -1 if we have an empty file */
	if (curr_section >= 0)
		cfg->sections[curr_section]->num_entries = curr_entry + 1;
	return cfg;

error1:
	rte_cfgfile_close(cfg);
error2:
	fclose(f);
	return NULL;
}
Пример #2
0
static int
app_install_cfgfile(const char *file_name)
{
	struct rte_cfgfile *file;
	uint32_t n_cores, i;

	memset(app.cores, 0, sizeof(app.cores));

	if (file_name[0] == '\0')
		return -1;

	file = rte_cfgfile_load(file_name, 0);
	if (file == NULL) {
		rte_panic("Config file %s not found\n", file_name);
		return -1;
	}

	n_cores = (uint32_t) rte_cfgfile_num_sections(file, "core",
		strnlen("core", 5));
	if (n_cores < app.n_cores) {
		rte_panic("Config file parse error: not enough cores specified "
			"(%u cores missing)\n", app.n_cores - n_cores);
		return -1;
	}
	if (n_cores > app.n_cores) {
		rte_panic("Config file parse error: too many cores specified "
			"(%u cores too many)\n", n_cores - app.n_cores);
		return -1;
	}

	for (i = 0; i < n_cores; i++) {
		struct app_core_params *p = &app.cores[i];
		char section_name[16];
		const char *entry;
		uint32_t j;

		/* [core X] */
		snprintf(section_name, sizeof(section_name), "core %u", i);
		if (!rte_cfgfile_has_section(file, section_name)) {
			rte_panic("Config file parse error: core IDs are not "
				"sequential (core %u missing)\n", i);
			return -1;
		}

		/* type */
		entry = rte_cfgfile_get_entry(file, section_name, "type");
		if (!entry) {
			rte_panic("Config file parse error: core %u type not "
				"defined\n", i);
			return -1;
		}
		if ((app_core_type_string_to_id(entry, &p->core_type) != 0) ||
		    (p->core_type == APP_CORE_NONE)) {
			rte_panic("Config file parse error: core %u type "
				"error\n", i);
			return -1;
		}

		/* queues in */
		entry = rte_cfgfile_get_entry(file, section_name, "queues in");
		if (!entry) {
			rte_panic("Config file parse error: core %u queues in "
				"not defined\n", i);
			return -1;
		}

		for (j = 0; (j < APP_MAX_SWQ_PER_CORE) && (entry != NULL);
			j++) {
			char *next;

			p->swq_in[j] =  (uint32_t) strtol(entry, &next, 10);
			if (next == entry)
				break;
			entry = next;
		}

		if ((j != APP_MAX_SWQ_PER_CORE) || (*entry != '\0')) {
			rte_panic("Config file parse error: core %u queues in "
				"error\n", i);
			return -1;
		}

		/* queues out */
		entry = rte_cfgfile_get_entry(file, section_name, "queues out");
		if (!entry) {
			rte_panic("Config file parse error: core %u queues out "
				"not defined\n", i);
			return -1;
		}

		for (j = 0; (j < APP_MAX_SWQ_PER_CORE) && (entry != NULL);
			j++) {
			char *next;

			p->swq_out[j] =  (uint32_t) strtol(entry, &next, 10);
			if (next == entry)
				break;
			entry = next;
		}
		if ((j != APP_MAX_SWQ_PER_CORE) || (*entry != '\0')) {
			rte_panic("Config file parse error: core %u queues out "
				"error\n", i);
			return -1;
		}
	}

	rte_cfgfile_close(file);

	return 0;
}