diff options
-rw-r--r-- | drm-lease-manager/drm-lease.h | 2 | ||||
-rw-r--r-- | drm-lease-manager/lease-config.c | 17 | ||||
-rw-r--r-- | drm-lease-manager/lease-manager.c | 22 |
3 files changed, 36 insertions, 5 deletions
diff --git a/drm-lease-manager/drm-lease.h b/drm-lease-manager/drm-lease.h index 2de4fa4..84fa942 100644 --- a/drm-lease-manager/drm-lease.h +++ b/drm-lease-manager/drm-lease.h @@ -15,6 +15,7 @@ #ifndef DRM_LEASE_H #define DRM_LEASE_H +#include <stdbool.h> #include <stdint.h> struct lease_handle { @@ -24,6 +25,7 @@ struct lease_handle { struct connector_config { char *name; + bool optional; }; struct lease_config { diff --git a/drm-lease-manager/lease-config.c b/drm-lease-manager/lease-config.c index e246445..b3f35a1 100644 --- a/drm-lease-manager/lease-config.c +++ b/drm-lease-manager/lease-config.c @@ -24,6 +24,7 @@ #define CONFIG_ERROR(x, ...) ERROR_LOG("%s: " x, filename, ##__VA_ARGS__) static bool populate_connector_config(struct lease_config *config, + toml_table_t *global_table, toml_array_t *conns) { int nconnectors = toml_array_nelem(conns); @@ -36,13 +37,24 @@ static bool populate_connector_config(struct lease_config *config, 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; } return true; } @@ -92,7 +104,8 @@ int parse_config(char *filename, struct lease_config **parsed_config) 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; diff --git a/drm-lease-manager/lease-manager.c b/drm-lease-manager/lease-manager.c index 177a241..3834631 100644 --- a/drm-lease-manager/lease-manager.c +++ b/drm-lease-manager/lease-manager.c @@ -356,11 +356,27 @@ static struct lease *lease_create(struct lm *lm, for (int i = 0; i < nconnectors; i++) { uint32_t cid; + struct connector_config *con_config = NULL; - if (config->nconnectors > 0) { - char *connector_name = config->connectors[i].name; + if (config->nconnectors > 0) + con_config = &config->connectors[i]; - if (!drm_find_connector(lm, connector_name, &cid)) { + if (con_config) { + char *connector_name = con_config->name; + bool optional = con_config->optional; + + bool found = + drm_find_connector(lm, connector_name, &cid); + + bool missing_mandatory = !found && !optional; + bool missing_optional = !found && optional; + + if (missing_mandatory) { + ERROR_LOG("Lease: %s, " + "mandatory connector %s not found\n", + config->lease_name, connector_name); + goto err; + } else if (missing_optional) { WARN_LOG("Lease: %s, " "unknown DRM connector: %s\n", config->lease_name, connector_name); |