/*
*
* modules.c
*
* LDAP / NIS map conversion module functions
*
* Author: Landon Fuller <landonf@go2net.com>
*
* Copyright (c) 2000-2001 InfoSpace, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by InfoSpace, Inc.
* and its contributors.
* 4. Neither the name of InfoSpace, Inc nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
#include "../autoconf.h"
#include <strings.h>
#include <dlfcn.h>
#include "yp.h"
#include "../include/config.h"
#include "../include/modules.h"
#include "../include/servconf.h"
#include "../include/yp.h"
#include "../include/util.h"
#include "../include/log.h"
struct ypmodulelist *yp_modulelist_create(char *modulestrings)
{
char *cp;
struct ypmodulelist *current = NULL;
struct ypmodulelist *head = NULL;
cp = strtok((char *) modulestrings, WHITESPACE);
if(!*cp)
return (NULL);
while(cp)
{
current = safe_malloc(sizeof(struct ypmodulelist));
current->path = strdup(cp);
current->next = head;
head = current;
cp = strtok(NULL, WHITESPACE);
}
return (head);
}
struct ypmoduledata *yp_get_module(char *map)
{
struct ypmodulelist *modlistcurrent = prefs.yp_modulelist;
struct ypmaplist *maplistcurrent;
while (modlistcurrent)
{
maplistcurrent = modlistcurrent->maps;
while(maplistcurrent)
{
if(!strcmp(maplistcurrent->map, map))
return(modlistcurrent->yp_moduledata);
maplistcurrent = maplistcurrent->next;
}
modlistcurrent = modlistcurrent->next;
}
return (NULL);
}
int modules_init(struct ypmodulelist *yp_modulelist)
{
struct ypmodulelist *current = NULL;
current = yp_modulelist;
while(current)
{
yp_modulelist->yp_moduledata = safe_malloc(sizeof(struct ypmoduledata));
yp_modulelist->yp_moduledata->log = warn;
yp_modulelist->yp_moduledata->safe_malloc = safe_malloc;
yp_modulelist->yp_moduledata->safe_realloc = safe_realloc;
yp_modulelist->yp_moduledata->safe_strdup = safe_strdup;
yp_modulelist->yp_moduledata->yp_maplist_create = yp_maplist_create;
current->ptr = dlopen(current->path, RTLD_NOW);
if(!current->ptr)
{
warn("dlopen failed: %s\n", dlerror());
current = current->next;
continue;
}
current->yp_moduledata->init = (bool_t (*) (struct ypmodulelist *)) dlsym(current->ptr, "init");
current->yp_moduledata->yp_clear = (int (*) (void)) dlsym(current->ptr, "yp_clear");
current->yp_moduledata->yp_getbykey = (int (*) (keydat *, mapname *, valdat *)) dlsym(current->ptr, "yp_getbykey");
current->yp_moduledata->yp_firstbykey = (int (*) (keydat *, mapname *, valdat *)) dlsym(current->ptr, "yp_firstbykey");
current->yp_moduledata->yp_nextbykey = (int (*) (keydat *, mapname *, valdat *)) dlsym(current->ptr, "yp_nextbykey");
if(!current->yp_moduledata->init || !current->yp_moduledata->yp_clear || !current->yp_moduledata->yp_getbykey)
{
warn("dlsym failed: %s\n", dlerror());
current = current->next;
continue;
}
if((*current->yp_moduledata->init) ((struct ypmodulelist *) current))
{
/* XXX Cheap way out. Need to free the data structure
* and remove it from the list. */
fatal("Failed to load module: %s\n", current->path);
}
current = current->next;
}
return (0);
}
syntax highlighted by Code2HTML, v. 0.9.1