debrix/hw/xorg/loader dlloader-ltdl.c,NONE,1.1

Daniel Stone <xserver-commit-u7BhqnqprCWvj1b/[email protected]>
Newsgroups gmane.comp.freedesktop.xserver.cvs
Message-ID <[email protected]>
Committed by: daniel

Update of /cvs/xserver/debrix/hw/xorg/loader
In directory pdx:/home/daniel/x/debrix/debrix/hw/xorg/loader

Added Files:
	dlloader-ltdl.c 
Log Message:
Adding missing files from the initial modular import.


--- NEW FILE: dlloader-ltdl.c ---
/* $XFree86: xc/programs/Xserver/hw/xfree86/loader/dlloader.c,v 1.13 2003/10/15 16:29:02 dawes Exp $ */

/*
 *
 * Copyright (c) 1997 The XFree86 Project, Inc.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of the
 * XFree86 Project, Inc. not be used in advertising or publicity
 * pertaining to distribution of the software without specific,
 * written prior permission.  The Xfree86 Project, Inc. makes no
 * representations about the suitability of this software for any
 * purpose.  It is provided "as is" without express or implied
 * warranty.
 *
 * THE XFREE86 PROJECT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO
 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS, IN NO EVENT SHALL THE XFREE86 PROJECT, INC. BE LIABLE
 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.  */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <ltdl.h>

#include <X11/Xos.h>
#include "os.h"

#include "sym.h"
#include "loader.h"
#include "dlloader.h"

#if defined(CSRG_BASED) && !defined(__ELF__)
#define NEED_UNDERSCORE_FOR_DLLSYM
#endif

int dlloaderIsInit = 0;

/*
 * This structure contains all of the information about a module
 * that has been loaded.
 */
typedef struct {
    int handle;
    lt_dlhandle dlhandle;
} DLModuleRec, *DLModulePtr;

/* 
 * a list of loaded modules XXX can be improved
 */
typedef struct DLModuleList {
    DLModulePtr module;
    struct DLModuleList *next;
} DLModuleList;

DLModuleList *dlModuleList = NULL;

/*
 * Search a symbol in the module list
 */
void *
DLFindSymbol(const char *name)
{
    DLModuleList *l;
    void *p;
    char *newName;

#ifdef NEED_UNDERSCORE_FOR_DLLSYM
    newName = xf86loadermalloc(strlen(name) + 2);
    sprintf(newName, "_%s", name);
#else
    strcpy(newName, name);
#endif

    (void)lt_dlerror();		/* Clear out any previous error */
    for (l = dlModuleList; l != NULL; l = l->next) {
	p = lt_dlsym(l->module->dlhandle, newName);
	if (lt_dlerror() == NULL) {
#ifdef NEED_UNDERSCORE_FOR_DLLSYM
	    xf86loaderfree(newName);
#endif
	    return p;
	}
    }
#ifdef NEED_UNDERSCORE_FOR_DLLSYM
    xf86loaderfree(newName);
#endif

    return NULL;
}

/*
 * public interface
 */
void *
DLLoadModule(loaderPtr modrec, int fd, LOOKUP ** ppLookup)
{
    DLModulePtr dlfile;
    DLModuleList *l;

    if (!dlloaderIsInit) {
        if (!lt_dlinit()) {
            ErrorF("Unable to initialise libltdl\n");
            return NULL;
        }
        /* I don't know if this is needed; if you know it isn't, please nuke it
         * (re LTDL_SET_PRELOADED_SYMBOLS). -d */
        LTDL_SET_PRELOADED_SYMBOLS();
        dlloaderIsInit = 1;
    }
                
    if ((dlfile = xf86loadercalloc(1, sizeof(DLModuleRec))) == NULL) {
	ErrorF("Unable to allocate DLModuleRec\n");
	return NULL;
    }
    dlfile->handle = modrec->handle;
    dlfile->dlhandle = lt_dlopen(modrec->name);
    if (dlfile->dlhandle == NULL) {
	ErrorF("lt_dlopen: %s\n", lt_dlerror());
	xf86loaderfree(dlfile);
	return NULL;
    }
    /* Add it to the module list */
    l = xf86loadermalloc(sizeof(DLModuleList));
    l->module = dlfile;
    l->next = dlModuleList;
    dlModuleList = l;
    *ppLookup = NULL;

    return (void *)dlfile;
}

void
DLResolveSymbols(void *mod)
{
    return;
}

int
DLCheckForUnresolved(void *mod)
{
    return 0;
}

void
DLUnloadModule(void *modptr)
{
    DLModulePtr dlfile = (DLModulePtr) modptr;
    DLModuleList *l, *p;

    /*  remove it from dlModuleList */
    if (dlModuleList->module == modptr) {
	l = dlModuleList;
	dlModuleList = l->next;
	xf86loaderfree(l);
    } else {
	p = dlModuleList;
	for (l = dlModuleList->next; l != NULL; l = l->next) {
	    if (l->module == modptr) {
		p->next = l->next;
		xf86loaderfree(l);
		break;
	    }
	    p = l;
	}
    }
    lt_dlclose(dlfile->dlhandle);
    xf86loaderfree(modptr);
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.