|
Packit |
995986 |
/* search.c
|
|
Packit |
995986 |
|
|
Packit |
995986 |
Free software by Richard W.E. Furse. Do with as you will. No
|
|
Packit |
995986 |
warranty. */
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/*****************************************************************************/
|
|
Packit |
995986 |
|
|
Packit |
995986 |
#include <dirent.h>
|
|
Packit |
995986 |
#include <dlfcn.h>
|
|
Packit |
995986 |
#include <stdio.h>
|
|
Packit |
995986 |
#include <stdlib.h>
|
|
Packit |
995986 |
#include <string.h>
|
|
Packit |
995986 |
#include <sys/types.h>
|
|
Packit |
995986 |
#include <unistd.h>
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/*****************************************************************************/
|
|
Packit |
995986 |
|
|
Packit |
995986 |
#include "ladspa.h"
|
|
Packit |
995986 |
#include "utils.h"
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/*****************************************************************************/
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/* Search just the one directory. */
|
|
Packit |
995986 |
static void
|
|
Packit |
995986 |
LADSPADirectoryPluginSearch
|
|
Packit |
995986 |
(const char * pcDirectory,
|
|
Packit |
995986 |
LADSPAPluginSearchCallbackFunction fCallbackFunction) {
|
|
Packit |
995986 |
|
|
Packit |
995986 |
char * pcFilename;
|
|
Packit |
995986 |
DIR * psDirectory;
|
|
Packit |
995986 |
LADSPA_Descriptor_Function fDescriptorFunction;
|
|
Packit |
995986 |
long lDirLength;
|
|
Packit |
995986 |
long iNeedSlash;
|
|
Packit |
995986 |
struct dirent * psDirectoryEntry;
|
|
Packit |
995986 |
void * pvPluginHandle;
|
|
Packit |
995986 |
|
|
Packit |
995986 |
lDirLength = strlen(pcDirectory);
|
|
Packit |
995986 |
if (!lDirLength)
|
|
Packit |
995986 |
return;
|
|
Packit |
995986 |
if (pcDirectory[lDirLength - 1] == '/')
|
|
Packit |
995986 |
iNeedSlash = 0;
|
|
Packit |
995986 |
else
|
|
Packit |
995986 |
iNeedSlash = 1;
|
|
Packit |
995986 |
|
|
Packit |
995986 |
psDirectory = opendir(pcDirectory);
|
|
Packit |
995986 |
if (!psDirectory)
|
|
Packit |
995986 |
return;
|
|
Packit |
995986 |
|
|
Packit |
995986 |
while (1) {
|
|
Packit |
995986 |
|
|
Packit |
995986 |
psDirectoryEntry = readdir(psDirectory);
|
|
Packit |
995986 |
if (!psDirectoryEntry) {
|
|
Packit |
995986 |
closedir(psDirectory);
|
|
Packit |
995986 |
return;
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pcFilename = malloc(lDirLength
|
|
Packit |
995986 |
+ strlen(psDirectoryEntry->d_name)
|
|
Packit |
995986 |
+ 1 + iNeedSlash);
|
|
Packit |
995986 |
strcpy(pcFilename, pcDirectory);
|
|
Packit |
995986 |
if (iNeedSlash)
|
|
Packit |
995986 |
strcat(pcFilename, "/");
|
|
Packit |
995986 |
strcat(pcFilename, psDirectoryEntry->d_name);
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pvPluginHandle = dlopen(pcFilename, RTLD_LAZY);
|
|
Packit |
995986 |
if (pvPluginHandle) {
|
|
Packit |
995986 |
/* This is a file and the file is a shared library! */
|
|
Packit |
995986 |
|
|
Packit |
995986 |
dlerror();
|
|
Packit |
995986 |
fDescriptorFunction
|
|
Packit |
995986 |
= (LADSPA_Descriptor_Function)dlsym(pvPluginHandle,
|
|
Packit |
995986 |
"ladspa_descriptor");
|
|
Packit |
995986 |
if (dlerror() == NULL && fDescriptorFunction) {
|
|
Packit |
995986 |
/* We've successfully found a ladspa_descriptor function. Pass
|
|
Packit |
995986 |
it to the callback function. */
|
|
Packit |
995986 |
fCallbackFunction(pcFilename,
|
|
Packit |
995986 |
pvPluginHandle,
|
|
Packit |
995986 |
fDescriptorFunction);
|
|
Packit |
995986 |
free(pcFilename);
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
else {
|
|
Packit |
995986 |
/* It was a library, but not a LADSPA one. Unload it. */
|
|
Packit |
995986 |
dlclose(pcFilename);
|
|
Packit |
995986 |
free(pcFilename);
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/*****************************************************************************/
|
|
Packit |
995986 |
|
|
Packit |
995986 |
void
|
|
Packit |
995986 |
LADSPAPluginSearch(LADSPAPluginSearchCallbackFunction fCallbackFunction) {
|
|
Packit |
995986 |
|
|
Packit |
995986 |
char * pcBuffer;
|
|
Packit |
995986 |
const char * pcEnd;
|
|
Packit |
995986 |
const char * pcLADSPAPath;
|
|
Packit |
995986 |
const char * pcStart;
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pcLADSPAPath = getenv("LADSPA_PATH");
|
|
Packit |
995986 |
if (!pcLADSPAPath) {
|
|
Packit |
714ff4 |
pcLADSPAPath = PLUGINDIR;
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pcStart = pcLADSPAPath;
|
|
Packit |
995986 |
while (*pcStart != '\0') {
|
|
Packit |
995986 |
pcEnd = pcStart;
|
|
Packit |
995986 |
while (*pcEnd != ':' && *pcEnd != '\0')
|
|
Packit |
995986 |
pcEnd++;
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pcBuffer = malloc(1 + pcEnd - pcStart);
|
|
Packit |
995986 |
if (pcEnd > pcStart)
|
|
Packit |
995986 |
strncpy(pcBuffer, pcStart, pcEnd - pcStart);
|
|
Packit |
995986 |
pcBuffer[pcEnd - pcStart] = '\0';
|
|
Packit |
995986 |
|
|
Packit |
995986 |
LADSPADirectoryPluginSearch(pcBuffer, fCallbackFunction);
|
|
Packit |
995986 |
free(pcBuffer);
|
|
Packit |
995986 |
|
|
Packit |
995986 |
pcStart = pcEnd;
|
|
Packit |
995986 |
if (*pcStart == ':')
|
|
Packit |
995986 |
pcStart++;
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
}
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/*****************************************************************************/
|
|
Packit |
995986 |
|
|
Packit |
995986 |
/* EOF */
|