mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
c266d310af
Original commit message from CVS: Based on Patch by: Brian Cameron <brian dot cameron at sun dot com> * ext/ladspa/search.c: (LADSPAPluginSearch): Avoid searching (null) paths or crashing on platforms where printing a NULL string segfaults. Fixes #567004.
145 lines
3.6 KiB
C
145 lines
3.6 KiB
C
/* search.c
|
|
|
|
Free software by Richard W.E. Furse. Do with as you will. No
|
|
warranty. */
|
|
|
|
/*****************************************************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <dirent.h>
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include <glib.h>
|
|
|
|
/*****************************************************************************/
|
|
|
|
#include "ladspa.h"
|
|
#include "utils.h"
|
|
|
|
/*****************************************************************************/
|
|
|
|
/* Search just the one directory. */
|
|
static void
|
|
LADSPADirectoryPluginSearch
|
|
(const char *pcDirectory,
|
|
LADSPAPluginSearchCallbackFunction fCallbackFunction)
|
|
{
|
|
|
|
char *pcFilename;
|
|
DIR *psDirectory;
|
|
LADSPA_Descriptor_Function fDescriptorFunction;
|
|
long lDirLength;
|
|
long iNeedSlash;
|
|
struct dirent *psDirectoryEntry;
|
|
void *pvPluginHandle;
|
|
|
|
lDirLength = strlen (pcDirectory);
|
|
if (!lDirLength)
|
|
return;
|
|
if (pcDirectory[lDirLength - 1] == '/')
|
|
iNeedSlash = 0;
|
|
else
|
|
iNeedSlash = 1;
|
|
|
|
psDirectory = opendir (pcDirectory);
|
|
if (!psDirectory)
|
|
return;
|
|
|
|
while (1) {
|
|
|
|
psDirectoryEntry = readdir (psDirectory);
|
|
if (!psDirectoryEntry) {
|
|
closedir (psDirectory);
|
|
return;
|
|
}
|
|
|
|
pcFilename = malloc (lDirLength + strlen (psDirectoryEntry->d_name)
|
|
+ 1 + iNeedSlash);
|
|
strcpy (pcFilename, pcDirectory);
|
|
if (iNeedSlash)
|
|
strcat (pcFilename, "/");
|
|
strcat (pcFilename, psDirectoryEntry->d_name);
|
|
|
|
pvPluginHandle = dlopen (pcFilename, RTLD_LAZY);
|
|
if (pvPluginHandle) {
|
|
/* This is a file and the file is a shared library! */
|
|
|
|
dlerror ();
|
|
fDescriptorFunction
|
|
= (LADSPA_Descriptor_Function) dlsym (pvPluginHandle,
|
|
"ladspa_descriptor");
|
|
if (dlerror () == NULL && fDescriptorFunction) {
|
|
/* We've successfully found a ladspa_descriptor function. Pass
|
|
it to the callback function. */
|
|
fCallbackFunction (pcFilename, pvPluginHandle, fDescriptorFunction);
|
|
} else {
|
|
/* It was a library, but not a LADSPA one. Unload it. */
|
|
dlclose (pvPluginHandle);
|
|
}
|
|
}
|
|
free (pcFilename);
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
void
|
|
LADSPAPluginSearch (LADSPAPluginSearchCallbackFunction fCallbackFunction)
|
|
{
|
|
|
|
char *pcBuffer;
|
|
const char *pcEnd;
|
|
const char *pcLADSPAPath;
|
|
const char *pcStart;
|
|
char *search_path;
|
|
|
|
/* thomasvs: I'm sorry, but I'm going to add glib stuff here.
|
|
* I'm appending logical values for LADSPA_PATH here
|
|
*/
|
|
|
|
search_path = getenv ("LADSPA_PATH");
|
|
if (search_path) {
|
|
pcLADSPAPath = g_strdup_printf ("%s:/usr/lib/ladspa:/usr/local/lib/ladspa",
|
|
search_path);
|
|
} else {
|
|
pcLADSPAPath = g_strdup ("/usr/lib/ladspa:/usr/local/lib/ladspa");
|
|
}
|
|
|
|
if (!pcLADSPAPath) {
|
|
/* fprintf(stderr, */
|
|
/* "Warning: You do not have a LADSPA_PATH " */
|
|
/* "environment variable set.\n"); */
|
|
return;
|
|
}
|
|
|
|
pcStart = pcLADSPAPath;
|
|
while (*pcStart != '\0') {
|
|
pcEnd = pcStart;
|
|
while (*pcEnd != ':' && *pcEnd != '\0')
|
|
pcEnd++;
|
|
|
|
pcBuffer = malloc (1 + pcEnd - pcStart);
|
|
if (pcEnd > pcStart)
|
|
strncpy (pcBuffer, pcStart, pcEnd - pcStart);
|
|
pcBuffer[pcEnd - pcStart] = '\0';
|
|
|
|
LADSPADirectoryPluginSearch (pcBuffer, fCallbackFunction);
|
|
free (pcBuffer);
|
|
|
|
pcStart = pcEnd;
|
|
if (*pcStart == ':')
|
|
pcStart++;
|
|
}
|
|
g_free ((gpointer) pcLADSPAPath);
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
|
|
/* EOF */
|