/* * * modules.c * * LDAP / NIS map conversion module functions * * Author: Landon Fuller * * 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 #include #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); }