From 577ad0c73a31e37c94819dc6c17c53afa5f33ad8 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 13 May 2021 15:09:57 +0200 Subject: [PATCH] conf: improve config error handling Make the config parser return the amount of parsed items. Fail to create a context when parsing the config fails. Log the number of items parsed from the config. --- src/pipewire/conf.c | 21 +++++++++++++++------ src/pipewire/context.c | 20 ++++++++++++-------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/pipewire/conf.c b/src/pipewire/conf.c index 24b15ffb4..0b0819bcc 100644 --- a/src/pipewire/conf.c +++ b/src/pipewire/conf.c @@ -281,6 +281,7 @@ static int parse_spa_libs(struct pw_context *context, char *str) { struct spa_json it[2]; char key[512], value[512]; + int count = 0; spa_json_init(&it[0], str, strlen(str)); if (spa_json_enter_object(&it[0], &it[1]) < 0) @@ -294,16 +295,17 @@ static int parse_spa_libs(struct pw_context *context, char *str) } else if (spa_json_get_string(&it[1], value, sizeof(value)-1) > 0) { pw_context_add_spa_lib(context, key, value); + count++; } } - return 0; + return count; } static int load_module(struct pw_context *context, const char *key, const char *args, const char *flags) { if (pw_context_load_module(context, key, args, NULL) == NULL) { if (errno == ENOENT && flags && strstr(flags, "ifexists") != NULL) { - pw_log_debug(NAME" %p: skipping unavailable module %s", + pw_log_info(NAME" %p: skipping unavailable module %s", context, key); } else if (flags == NULL || strstr(flags, "nofail") == NULL) { pw_log_error(NAME" %p: could not load mandatory module \"%s\": %m", @@ -313,6 +315,8 @@ static int load_module(struct pw_context *context, const char *key, const char * pw_log_info(NAME" %p: could not load optional module \"%s\": %m", context, key); } + } else { + pw_log_info(NAME" %p: loaded module %s", context, key); } return 0; } @@ -329,7 +333,7 @@ static int parse_modules(struct pw_context *context, char *str) { struct spa_json it[3]; char key[512]; - int res = 0; + int res = 0, count = 0; spa_json_init(&it[0], str, strlen(str)); if (spa_json_enter_array(&it[0], &it[1]) < 0) @@ -366,6 +370,8 @@ static int parse_modules(struct pw_context *context, char *str) if (res < 0) break; + + res = ++count; } return res; } @@ -409,7 +415,7 @@ static int parse_objects(struct pw_context *context, char *str) { struct spa_json it[3]; char key[512]; - int res = 0; + int res = 0, count = 0; spa_json_init(&it[0], str, strlen(str)); if (spa_json_enter_array(&it[0], &it[1]) < 0) @@ -447,6 +453,7 @@ static int parse_objects(struct pw_context *context, char *str) if (res < 0) break; + res = ++count; } return res; } @@ -493,7 +500,7 @@ static int parse_exec(struct pw_context *context, char *str) { struct spa_json it[3]; char key[512]; - int res = 0; + int res = 0, count = 0; spa_json_init(&it[0], str, strlen(str)); if (spa_json_enter_array(&it[0], &it[1]) < 0) @@ -522,6 +529,8 @@ static int parse_exec(struct pw_context *context, char *str) if (res < 0) break; + + res = ++count; } return res; } @@ -535,7 +544,7 @@ int pw_context_parse_conf_section(struct pw_context *context, int res; if ((str = pw_properties_get(conf, section)) == NULL) - return -ENOENT; + return 0; s = strdup(str); diff --git a/src/pipewire/context.c b/src/pipewire/context.c index 838a5ed1d..bc82873fd 100644 --- a/src/pipewire/context.c +++ b/src/pipewire/context.c @@ -361,14 +361,18 @@ struct pw_context *pw_context_new(struct pw_loop *main_loop, this->sc_pagesize = sysconf(_SC_PAGESIZE); - if ((res = pw_context_parse_conf_section(this, conf, "context.spa-libs")) >= 0) - pw_log_info(NAME" %p: parsed context.spa-libs section", this); - if ((res = pw_context_parse_conf_section(this, conf, "context.modules")) >= 0) - pw_log_info(NAME" %p: parsed context.modules section", this); - if ((res = pw_context_parse_conf_section(this, conf, "context.objects")) >= 0) - pw_log_info(NAME" %p: parsed context.objects section", this); - if ((res = pw_context_parse_conf_section(this, conf, "context.exec")) >= 0) - pw_log_info(NAME" %p: parsed context.exec section", this); + if ((res = pw_context_parse_conf_section(this, conf, "context.spa-libs")) < 0) + goto error_free_loop; + pw_log_info(NAME" %p: parsed %d context.spa-libs items", this, res); + if ((res = pw_context_parse_conf_section(this, conf, "context.modules")) < 0) + goto error_free_loop; + pw_log_info(NAME" %p: parsed %d context.modules items", this, res); + if ((res = pw_context_parse_conf_section(this, conf, "context.objects")) < 0) + goto error_free_loop; + pw_log_info(NAME" %p: parsed %d context.objects items", this, res); + if ((res = pw_context_parse_conf_section(this, conf, "context.exec")) < 0) + goto error_free_loop; + pw_log_info(NAME" %p: parsed %d context.exec items", this, res); pw_log_debug(NAME" %p: created", this);