Blame src/search.c

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 */