#define CONFIG_ERROR(x, ...) ERROR_LOG("%s: " x, filename, ##__VA_ARGS__)
+static bool populate_connector_planes(struct connector_config *config,
+ toml_array_t *planes)
+{
+ config->nplanes = toml_array_nelem(planes);
+ config->planes = calloc(config->nplanes, sizeof(uint32_t));
+ if (!config->planes) {
+ DEBUG_LOG("Memory allocation failed: %s\n", strerror(errno));
+ return false;
+ }
+
+ for (int j = 0; j < config->nplanes; j++) {
+ toml_datum_t plane = toml_int_at(planes, j);
+ if (!plane.ok) {
+ return false;
+ }
+ config->planes[j] = plane.u.i;
+ }
+ return true;
+}
+
static bool populate_connector_config(struct lease_config *config,
+ toml_table_t *global_table,
toml_array_t *conns)
{
int nconnectors = toml_array_nelem(conns);
config->nconnectors = nconnectors;
for (int i = 0; i < config->nconnectors; i++) {
+ struct connector_config *conn_config = &config->connectors[i];
toml_datum_t conn = toml_string_at(conns, i);
if (!conn.ok) {
ERROR_LOG("Invalid connector in lease %s: idx:%d\n",
config->lease_name, i);
return false;
}
- config->connectors[i].name = conn.u.s;
+ conn_config->name = conn.u.s;
+
+ toml_table_t *conn_config_data =
+ toml_table_in(global_table, conn.u.s);
+ if (!conn_config_data)
+ continue;
+
+ toml_datum_t optional =
+ toml_bool_in(conn_config_data, "optional");
+ if (optional.ok)
+ config->connectors[i].optional = optional.u.b;
+
+ toml_array_t *planes =
+ toml_array_in(conn_config_data, "planes");
+ if (planes && !populate_connector_planes(conn_config, planes)) {
+ ERROR_LOG("Invalid plane id for connector: %s\n",
+ conn_config->name);
+ return false;
+ }
}
return true;
}
config[i].lease_name = name.u.s;
toml_array_t *conns = toml_array_in(lease, "connectors");
- if (conns && !populate_connector_config(&config[i], conns)) {
+ if (conns &&
+ !populate_connector_config(&config[i], t_config, conns)) {
CONFIG_ERROR("Error configuring lease: %s\n",
config[i].lease_name);
goto err_free_config;
for (int i = 0; i < num_leases; i++) {
struct lease_config *c = &config[i];
free(c->lease_name);
- for (int j = 0; j < c->nconnectors; j++)
+ for (int j = 0; j < c->nconnectors; j++) {
free(c->connectors[j].name);
+ free(c->connectors[j].planes);
+ }
free(c->connectors);
}
free(config);