command: add -ifexists option to load-module

If the module doesn't exist, the error is ignored.
This commit is contained in:
Wim Taymans 2020-02-05 13:01:13 +01:00
parent 8b6a163233
commit d0f69e44cd
2 changed files with 31 additions and 5 deletions

View file

@ -44,6 +44,7 @@ static struct pw_command *parse_command_exec(struct pw_properties *properties, c
struct impl {
struct pw_command this;
int first_arg;
};
typedef struct pw_command *(*pw_command_parse_func_t) (struct pw_properties *properties, const char *line, char **err);
@ -174,14 +175,32 @@ no_mem:
return NULL;
}
static bool has_option(struct pw_command *this, int first_arg, const char *option)
{
int arg;
for (arg = 1; arg < first_arg; arg++) {
if (strstr(this->args[arg], "-") == this->args[arg]) {
if (strcmp(this->args[arg], option) == 0)
return true;
}
}
return false;
}
static int
execute_command_module_load(struct pw_command *command, struct pw_context *context, char **err)
{
struct pw_impl_module *module;
struct impl *impl = SPA_CONTAINER_OF(command, struct impl, this);
int arg = impl->first_arg;
module = pw_context_load_module(context, command->args[1], command->args[2], NULL);
module = pw_context_load_module(context, command->args[arg], command->args[arg+1], NULL);
if (module == NULL) {
*err = spa_aprintf("could not load module \"%s\": %m", command->args[1]);
if (errno == ENOENT && has_option(command, arg, "-ifexists")) {
pw_log_debug("skipping unavailable module %s", command->args[arg]);
return 0;
}
*err = spa_aprintf("could not load module \"%s\": %m", command->args[arg]);
return -errno;
}
return 0;
@ -191,6 +210,7 @@ static struct pw_command *parse_command_module_load(struct pw_properties *proper
{
struct impl *impl;
struct pw_command *this;
int arg;
impl = calloc(1, sizeof(struct impl));
if (impl == NULL)
@ -198,11 +218,17 @@ static struct pw_command *parse_command_module_load(struct pw_properties *proper
this = &impl->this;
this->func = execute_command_module_load;
this->args = pw_split_strv(line, whitespace, 3, &this->n_args);
this->args = pw_split_strv(line, whitespace, INT_MAX, &this->n_args);
if (this->n_args < 2)
for (arg = 1; arg < this->n_args; arg++) {
if (strstr(this->args[arg], "-") != this->args[arg])
break;
}
if (arg + 1 > this->n_args)
goto no_module;
impl->first_arg = arg;
return this;
no_module:

View file

@ -21,7 +21,7 @@ add-spa-lib api.bluez5.* bluez5/libspa-bluez5
add-spa-lib api.vulkan.* vulkan/libspa-vulkan
add-spa-lib api.jack.* jack/libspa-jack
#load-module libpipewire-module-spa-device api.jack.device
#load-module -ifexists libpipewire-module-spa-device api.jack.device
#load-module libpipewire-module-spa-device api.alsa.enum.udev
#load-module libpipewire-module-spa-node api.alsa.seq.bridge node.name=MIDI-Bridge
load-module libpipewire-module-rtkit