mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
examples: dlclose on some errors
This commit is contained in:
parent
e11d35107f
commit
5295caf0f3
1 changed files with 28 additions and 16 deletions
|
|
@ -101,18 +101,20 @@ static int load_handle(struct data *data, struct spa_handle **handle, const char
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
if ((path = spa_aprintf("%s/%s", data->plugin_dir, lib)) == NULL) {
|
if ((path = spa_aprintf("%s/%s", data->plugin_dir, lib)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
if ((hnd = dlopen(path, RTLD_NOW)) == NULL) {
|
hnd = dlopen(path, RTLD_NOW);
|
||||||
|
free(path);
|
||||||
|
|
||||||
|
if (hnd == NULL) {
|
||||||
printf("can't load %s: %s\n", lib, dlerror());
|
printf("can't load %s: %s\n", lib, dlerror());
|
||||||
free(path);
|
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
free(path);
|
|
||||||
if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) {
|
if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) {
|
||||||
printf("can't find enum function\n");
|
printf("can't find enum function\n");
|
||||||
return -ENOENT;
|
res = -ENOENT;
|
||||||
|
goto exit_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0;;) {
|
for (i = 0;;) {
|
||||||
|
|
@ -133,11 +135,15 @@ static int load_handle(struct data *data, struct spa_handle **handle, const char
|
||||||
NULL, data->support,
|
NULL, data->support,
|
||||||
data->n_support)) < 0) {
|
data->n_support)) < 0) {
|
||||||
printf("can't make factory instance: %d\n", res);
|
printf("can't make factory instance: %d\n", res);
|
||||||
return res;
|
goto exit_cleanup;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
|
exit_cleanup:
|
||||||
|
dlclose(hnd);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int init_data(struct data *data)
|
int init_data(struct data *data)
|
||||||
|
|
@ -201,23 +207,25 @@ static int make_node(struct data *data, struct spa_node **node, const char *lib,
|
||||||
{
|
{
|
||||||
struct spa_handle *handle;
|
struct spa_handle *handle;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
void *hnd;
|
void *hnd = NULL;
|
||||||
spa_handle_factory_enum_func_t enum_func;
|
spa_handle_factory_enum_func_t enum_func;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
char *path;
|
char *path;
|
||||||
|
|
||||||
if ((path = spa_aprintf("%s/%s", data->plugin_dir, lib)) == NULL) {
|
if ((path = spa_aprintf("%s/%s", data->plugin_dir, lib)) == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
if ((hnd = dlopen(path, RTLD_NOW)) == NULL) {
|
hnd = dlopen(path, RTLD_NOW);
|
||||||
|
free(path);
|
||||||
|
|
||||||
|
if (hnd == NULL) {
|
||||||
printf("can't load %s: %s\n", lib, dlerror());
|
printf("can't load %s: %s\n", lib, dlerror());
|
||||||
free(path);
|
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
free(path);
|
|
||||||
if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) {
|
if ((enum_func = dlsym(hnd, SPA_HANDLE_FACTORY_ENUM_FUNC_NAME)) == NULL) {
|
||||||
printf("can't find enum function\n");
|
printf("can't find enum function\n");
|
||||||
return -ENOENT;
|
res = -ENOENT;
|
||||||
|
goto exit_cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0;;) {
|
for (i = 0;;) {
|
||||||
|
|
@ -239,16 +247,20 @@ static int make_node(struct data *data, struct spa_node **node, const char *lib,
|
||||||
spa_handle_factory_init(factory, handle, props, data->support,
|
spa_handle_factory_init(factory, handle, props, data->support,
|
||||||
data->n_support)) < 0) {
|
data->n_support)) < 0) {
|
||||||
printf("can't make factory instance: %d\n", res);
|
printf("can't make factory instance: %d\n", res);
|
||||||
return res;
|
goto exit_cleanup;
|
||||||
}
|
}
|
||||||
if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Node, &iface)) < 0) {
|
if ((res = spa_handle_get_interface(handle, SPA_TYPE_INTERFACE_Node, &iface)) < 0) {
|
||||||
printf("can't get interface %d\n", res);
|
printf("can't get interface %d\n", res);
|
||||||
return res;
|
goto exit_cleanup;
|
||||||
}
|
}
|
||||||
*node = iface;
|
*node = iface;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
|
|
||||||
|
exit_cleanup:
|
||||||
|
dlclose(hnd);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int on_sink_node_ready(void *_data, int status)
|
static int on_sink_node_ready(void *_data, int status)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue