Merge remote branch 'ajax/less-loader'
This commit is contained in:
commit
5532687a92
|
@ -125,7 +125,6 @@ xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags)
|
||||||
xnfalloc(sizeof(InputDriverRec));
|
xnfalloc(sizeof(InputDriverRec));
|
||||||
*xf86InputDriverList[xf86NumInputDrivers - 1] = *driver;
|
*xf86InputDriverList[xf86NumInputDrivers - 1] = *driver;
|
||||||
xf86InputDriverList[xf86NumInputDrivers - 1]->module = module;
|
xf86InputDriverList[xf86NumInputDrivers - 1]->module = module;
|
||||||
xf86InputDriverList[xf86NumInputDrivers - 1]->refCount = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -284,7 +283,6 @@ xf86AllocateInput(InputDriverPtr drv, int flags)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
new->drv = drv;
|
new->drv = drv;
|
||||||
drv->refCount++;
|
|
||||||
new->module = DuplicateModule(drv->module, NULL);
|
new->module = DuplicateModule(drv->module, NULL);
|
||||||
|
|
||||||
for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next)
|
for (prev = &xf86InputDevs; *prev; prev = &(*prev)->next)
|
||||||
|
@ -320,9 +318,6 @@ xf86DeleteInput(InputInfoPtr pInp, int flags)
|
||||||
if (pInp->module)
|
if (pInp->module)
|
||||||
UnloadModule(pInp->module);
|
UnloadModule(pInp->module);
|
||||||
|
|
||||||
if (pInp->drv)
|
|
||||||
pInp->drv->refCount--;
|
|
||||||
|
|
||||||
/* This should *really* be handled in drv->UnInit(dev) call instead, but
|
/* This should *really* be handled in drv->UnInit(dev) call instead, but
|
||||||
* if the driver forgets about it make sure we free it or at least crash
|
* if the driver forgets about it make sure we free it or at least crash
|
||||||
* with flying colors */
|
* with flying colors */
|
||||||
|
|
|
@ -103,7 +103,6 @@ typedef struct _InputDriverRec {
|
||||||
struct _LocalDeviceRec *pInfo,
|
struct _LocalDeviceRec *pInfo,
|
||||||
int flags);
|
int flags);
|
||||||
pointer module;
|
pointer module;
|
||||||
int refCount;
|
|
||||||
} InputDriverRec, *InputDriverPtr;
|
} InputDriverRec, *InputDriverPtr;
|
||||||
|
|
||||||
/* This is to input devices what the ScrnInfoRec is to screens. */
|
/* This is to input devices what the ScrnInfoRec is to screens. */
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
|
|
||||||
#define PAGE_MASK (~(getpagesize() - 1))
|
#define PAGE_MASK (~(getpagesize() - 1))
|
||||||
|
|
||||||
static MODULESETUPPROTO(fbdevhwSetup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo fbdevHWVersRec =
|
static XF86ModuleVersionInfo fbdevHWVersRec =
|
||||||
{
|
{
|
||||||
"fbdevhw",
|
"fbdevhw",
|
||||||
|
@ -39,16 +37,10 @@ static XF86ModuleVersionInfo fbdevHWVersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData fbdevhwModuleData = {
|
_X_EXPORT XF86ModuleData fbdevhwModuleData = {
|
||||||
&fbdevHWVersRec,
|
&fbdevHWVersRec,
|
||||||
fbdevhwSetup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
fbdevhwSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
|
||||||
{
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(bt829Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo bt829VersRec =
|
static XF86ModuleVersionInfo bt829VersRec =
|
||||||
{
|
{
|
||||||
"bt829",
|
"bt829",
|
||||||
|
@ -20,9 +18,4 @@ static XF86ModuleVersionInfo bt829VersRec =
|
||||||
{0,0,0,0}
|
{0,0,0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData bt829ModuleData = { &bt829VersRec, bt829Setup, NULL };
|
_X_EXPORT XF86ModuleData bt829ModuleData = { &bt829VersRec, NULL, NULL };
|
||||||
|
|
||||||
static pointer
|
|
||||||
bt829Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(fi1236Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo fi1236VersRec =
|
static XF86ModuleVersionInfo fi1236VersRec =
|
||||||
{
|
{
|
||||||
"fi1236",
|
"fi1236",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo fi1236VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData fi1236ModuleData = {
|
_X_EXPORT XF86ModuleData fi1236ModuleData = {
|
||||||
&fi1236VersRec,
|
&fi1236VersRec,
|
||||||
fi1236Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
fi1236Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(msp3430Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo msp3430VersRec =
|
static XF86ModuleVersionInfo msp3430VersRec =
|
||||||
{
|
{
|
||||||
"msp3430",
|
"msp3430",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo msp3430VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData msp3430ModuleData = {
|
_X_EXPORT XF86ModuleData msp3430ModuleData = {
|
||||||
&msp3430VersRec,
|
&msp3430VersRec,
|
||||||
msp3430Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
msp3430Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(tda8425Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo tda8425VersRec =
|
static XF86ModuleVersionInfo tda8425VersRec =
|
||||||
{
|
{
|
||||||
"tda8425",
|
"tda8425",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo tda8425VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData tda8425ModuleData = {
|
_X_EXPORT XF86ModuleData tda8425ModuleData = {
|
||||||
&tda8425VersRec,
|
&tda8425VersRec,
|
||||||
tda8425Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
tda8425Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(tda9850Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo tda9850VersRec =
|
static XF86ModuleVersionInfo tda9850VersRec =
|
||||||
{
|
{
|
||||||
"tda9850",
|
"tda9850",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo tda9850VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData tda9850ModuleData = {
|
_X_EXPORT XF86ModuleData tda9850ModuleData = {
|
||||||
&tda9850VersRec,
|
&tda9850VersRec,
|
||||||
tda9850Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
tda9850Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(tda9885Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo tda9885VersRec =
|
static XF86ModuleVersionInfo tda9885VersRec =
|
||||||
{
|
{
|
||||||
"tda9885",
|
"tda9885",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo tda9885VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData tda9885ModuleData = {
|
_X_EXPORT XF86ModuleData tda9885ModuleData = {
|
||||||
&tda9885VersRec,
|
&tda9885VersRec,
|
||||||
tda9885Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
tda9885Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
#include "xf86Module.h"
|
#include "xf86Module.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(uda1380Setup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo uda1380VersRec =
|
static XF86ModuleVersionInfo uda1380VersRec =
|
||||||
{
|
{
|
||||||
"uda1380",
|
"uda1380",
|
||||||
|
@ -22,11 +20,6 @@ static XF86ModuleVersionInfo uda1380VersRec =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData uda1380ModuleData = {
|
_X_EXPORT XF86ModuleData uda1380ModuleData = {
|
||||||
&uda1380VersRec,
|
&uda1380VersRec,
|
||||||
uda1380Setup,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
uda1380Setup(pointer module, pointer opts, int *errmaj, int *errmin) {
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -22,8 +22,6 @@
|
||||||
#define combine(a,b) concat(a,b)
|
#define combine(a,b) concat(a,b)
|
||||||
#define NAME(x) combine(MOD_NAME,x)
|
#define NAME(x) combine(MOD_NAME,x)
|
||||||
|
|
||||||
static MODULESETUPPROTO(NAME(Setup));
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo NAME(VersRec) =
|
static XF86ModuleVersionInfo NAME(VersRec) =
|
||||||
{
|
{
|
||||||
STRING(NAME( )),
|
STRING(NAME( )),
|
||||||
|
@ -40,25 +38,6 @@ static XF86ModuleVersionInfo NAME(VersRec) =
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData NAME(ModuleData) = {
|
_X_EXPORT XF86ModuleData NAME(ModuleData) = {
|
||||||
&NAME(VersRec),
|
&NAME(VersRec),
|
||||||
NAME(Setup),
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static pointer
|
|
||||||
NAME(Setup)(pointer module, pointer opts, int *errmaj, int *errmin)
|
|
||||||
{
|
|
||||||
static Bool setupDone = FALSE;
|
|
||||||
|
|
||||||
if (!setupDone) {
|
|
||||||
setupDone = TRUE;
|
|
||||||
/*
|
|
||||||
* Tell the loader about symbols from other modules that this module
|
|
||||||
* might refer to.
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* The return value must be non-NULL on success even though there
|
|
||||||
* is no TearDownProc.
|
|
||||||
*/
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ INCLUDES = $(XORG_INCS) -I$(srcdir)/../parser -I$(top_srcdir)/miext/cw \
|
||||||
AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
|
AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
dlloader.h \
|
|
||||||
loader.h \
|
loader.h \
|
||||||
loaderProcs.h \
|
loaderProcs.h \
|
||||||
sdksyms.sh
|
sdksyms.sh
|
||||||
|
@ -18,7 +17,6 @@ libloader_la_SOURCES = \
|
||||||
loaderProcs.h \
|
loaderProcs.h \
|
||||||
loadext.c \
|
loadext.c \
|
||||||
loadmod.c \
|
loadmod.c \
|
||||||
dlloader.c \
|
|
||||||
os.c \
|
os.c \
|
||||||
sdksyms.c
|
sdksyms.c
|
||||||
libloader_la_LIBADD = $(DLOPEN_LIBS)
|
libloader_la_LIBADD = $(DLOPEN_LIBS)
|
||||||
|
|
|
@ -1,178 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Once upon a time, X had multiple loader backends, three of which were
|
|
||||||
* essentially libdl reimplementations. This was nonsense so we chucked
|
|
||||||
* it, but we still retain the factorization between loader API and
|
|
||||||
* platform implementation. This file is the libdl implementation, and
|
|
||||||
* currently the only backend. If you find yourself porting to a platform
|
|
||||||
* without working libdl - hpux, win32, some forsaken a.out host, etc. -
|
|
||||||
* make a new backend rather than hacking up this file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_XORG_CONFIG_H
|
|
||||||
#include <xorg-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <dlfcn.h>
|
|
||||||
|
|
||||||
#include <X11/Xos.h>
|
|
||||||
#include "os.h"
|
|
||||||
|
|
||||||
#include "loader.h"
|
|
||||||
#include "dlloader.h"
|
|
||||||
|
|
||||||
#if defined(DL_LAZY)
|
|
||||||
#define DLOPEN_LAZY DL_LAZY
|
|
||||||
#elif defined(RTLD_LAZY)
|
|
||||||
#define DLOPEN_LAZY RTLD_LAZY
|
|
||||||
#elif defined(__FreeBSD__)
|
|
||||||
#define DLOPEN_LAZY 1
|
|
||||||
#else
|
|
||||||
#define DLOPEN_LAZY 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(LD_GLOBAL)
|
|
||||||
#define DLOPEN_GLOBAL LD_GLOBAL
|
|
||||||
#elif defined(RTLD_GLOBAL)
|
|
||||||
#define DLOPEN_GLOBAL RTLD_GLOBAL
|
|
||||||
#else
|
|
||||||
#define DLOPEN_GLOBAL 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CSRG_BASED) && !defined(__ELF__)
|
|
||||||
#define DLSYM_PREFIX "_"
|
|
||||||
#else
|
|
||||||
#define DLSYM_PREFIX ""
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Hooray, yet another open coded linked list! FIXME */
|
|
||||||
typedef struct DLModuleList {
|
|
||||||
void *module;
|
|
||||||
struct DLModuleList *next;
|
|
||||||
} DLModuleList;
|
|
||||||
|
|
||||||
static DLModuleList *dlModuleList = NULL;
|
|
||||||
|
|
||||||
static void *
|
|
||||||
DLFindSymbolLocal(pointer module, const char *name)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
char *n;
|
|
||||||
|
|
||||||
static const char symPrefix[] = DLSYM_PREFIX;
|
|
||||||
|
|
||||||
if (sizeof(symPrefix) > 1) {
|
|
||||||
n = malloc(strlen(symPrefix) + strlen(name) + 1);
|
|
||||||
sprintf(n, "%s%s", symPrefix, name);
|
|
||||||
name = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = dlsym(module, name);
|
|
||||||
|
|
||||||
if (sizeof(symPrefix) > 1)
|
|
||||||
free(n);
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *global_scope = NULL;
|
|
||||||
|
|
||||||
void *
|
|
||||||
DLFindSymbol(const char *name)
|
|
||||||
{
|
|
||||||
DLModuleList *l;
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
p = dlsym(RTLD_DEFAULT, name);
|
|
||||||
if (p != NULL)
|
|
||||||
return p;
|
|
||||||
|
|
||||||
for (l = dlModuleList; l != NULL; l = l->next) {
|
|
||||||
p = DLFindSymbolLocal(l->module, name);
|
|
||||||
if (p)
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!global_scope)
|
|
||||||
global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL);
|
|
||||||
|
|
||||||
if (global_scope)
|
|
||||||
return DLFindSymbolLocal(global_scope, name);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
DLLoadModule(loaderPtr modrec, int flags)
|
|
||||||
{
|
|
||||||
void * dlfile;
|
|
||||||
DLModuleList *l;
|
|
||||||
int dlopen_flags;
|
|
||||||
|
|
||||||
if (flags & LD_FLAG_GLOBAL)
|
|
||||||
dlopen_flags = DLOPEN_LAZY | DLOPEN_GLOBAL;
|
|
||||||
else
|
|
||||||
dlopen_flags = DLOPEN_LAZY;
|
|
||||||
dlfile = dlopen(modrec->name, dlopen_flags);
|
|
||||||
if (dlfile == NULL) {
|
|
||||||
ErrorF("dlopen: %s\n", dlerror());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
l = malloc(sizeof(DLModuleList));
|
|
||||||
l->module = dlfile;
|
|
||||||
l->next = dlModuleList;
|
|
||||||
dlModuleList = l;
|
|
||||||
|
|
||||||
return (void *)dlfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
DLUnloadModule(void *modptr)
|
|
||||||
{
|
|
||||||
DLModuleList *l, *p;
|
|
||||||
|
|
||||||
/* remove it from dlModuleList. */
|
|
||||||
if (dlModuleList->module == modptr) {
|
|
||||||
l = dlModuleList;
|
|
||||||
dlModuleList = l->next;
|
|
||||||
free(l);
|
|
||||||
} else {
|
|
||||||
p = dlModuleList;
|
|
||||||
for (l = dlModuleList->next; l != NULL; l = l->next) {
|
|
||||||
if (l->module == modptr) {
|
|
||||||
p->next = l->next;
|
|
||||||
free(l);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
p = l;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dlclose(modptr);
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 1997 Metro Link, 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 Metro Link, Inc. not be used in
|
|
||||||
* advertising or publicity pertaining to distribution of the software without
|
|
||||||
* specific, written prior permission. Metro Link, Inc. makes no
|
|
||||||
* representations about the suitability of this software for any purpose.
|
|
||||||
* It is provided "as is" without express or implied warranty.
|
|
||||||
*
|
|
||||||
* METRO LINK, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
||||||
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
||||||
* EVENT SHALL METRO LINK, 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_XORG_CONFIG_H
|
|
||||||
#include <xorg-config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _DLLOADER_H
|
|
||||||
#define _DLLOADER_H
|
|
||||||
|
|
||||||
extern void *DLLoadModule(loaderPtr, int flags);
|
|
||||||
extern void DLUnloadModule(void *);
|
|
||||||
extern void *DLFindSymbol(const char *name);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -54,18 +54,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#if defined(UseMMAP) || (defined(linux) && defined(__ia64__))
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#endif
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#if defined(linux) && \
|
|
||||||
(defined(__alpha__) || defined(__powerpc__) || defined(__ia64__) \
|
|
||||||
|| defined(__amd64__))
|
|
||||||
#include <malloc.h>
|
|
||||||
#endif
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
@ -75,45 +67,35 @@
|
||||||
#include "xf86Priv.h"
|
#include "xf86Priv.h"
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_DLFCN_H
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <X11/Xos.h>
|
||||||
|
|
||||||
|
#if defined(DL_LAZY)
|
||||||
|
#define DLOPEN_LAZY DL_LAZY
|
||||||
|
#elif defined(RTLD_LAZY)
|
||||||
|
#define DLOPEN_LAZY RTLD_LAZY
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
#define DLOPEN_LAZY 1
|
||||||
|
#else
|
||||||
|
#define DLOPEN_LAZY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(LD_GLOBAL)
|
||||||
|
#define DLOPEN_GLOBAL LD_GLOBAL
|
||||||
|
#elif defined(RTLD_GLOBAL)
|
||||||
|
#define DLOPEN_GLOBAL RTLD_GLOBAL
|
||||||
|
#else
|
||||||
|
#define DLOPEN_GLOBAL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error i have no dynamic linker and i must scream
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void *xorg_symbols[];
|
extern void *xorg_symbols[];
|
||||||
|
|
||||||
#define MAX_HANDLE 256
|
|
||||||
static int refCount[MAX_HANDLE];
|
|
||||||
|
|
||||||
static int moduleseq = 0;
|
|
||||||
|
|
||||||
/* Prototypes for static functions. */
|
|
||||||
static loaderPtr listHead = NULL;
|
|
||||||
|
|
||||||
static loaderPtr
|
|
||||||
_LoaderListPush(void)
|
|
||||||
{
|
|
||||||
loaderPtr item = calloc(1, sizeof(struct _loader));
|
|
||||||
|
|
||||||
item->next = listHead;
|
|
||||||
listHead = item;
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
static loaderPtr
|
|
||||||
_LoaderListPop(int handle)
|
|
||||||
{
|
|
||||||
loaderPtr item = listHead;
|
|
||||||
loaderPtr *bptr = &listHead; /* pointer to previous node */
|
|
||||||
|
|
||||||
while (item) {
|
|
||||||
if (item->handle == handle) {
|
|
||||||
*bptr = item->next; /* remove this from the list */
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
bptr = &(item->next);
|
|
||||||
item = item->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
LoaderInit(void)
|
LoaderInit(void)
|
||||||
{
|
{
|
||||||
|
@ -149,134 +131,60 @@ LoaderInit(void)
|
||||||
path = uwcrtpath; /* fallback: try to get libcrt.a from the uccs */
|
path = uwcrtpath; /* fallback: try to get libcrt.a from the uccs */
|
||||||
else
|
else
|
||||||
path = xcrtpath; /* get the libcrt.a we compiled with */
|
path = xcrtpath; /* get the libcrt.a we compiled with */
|
||||||
LoaderOpen (path, "libcrt", 0, &errmaj, &errmin, &wasLoaded);
|
LoaderOpen (path, &errmaj, &errmin, &wasLoaded, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Public Interface to the loader. */
|
/* Public Interface to the loader. */
|
||||||
|
|
||||||
int
|
void *
|
||||||
LoaderOpen(const char *module, const char *cname, int handle,
|
LoaderOpen(const char *module, int *errmaj, int *errmin)
|
||||||
int *errmaj, int *errmin, int *wasLoaded, int flags)
|
|
||||||
{
|
{
|
||||||
loaderPtr tmp;
|
void *ret;
|
||||||
int new_handle;
|
|
||||||
|
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
ErrorF("LoaderOpen(%s)\n", module);
|
ErrorF("LoaderOpen(%s)\n", module);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Is the module already loaded? */
|
|
||||||
if (handle >= 0) {
|
|
||||||
tmp = listHead;
|
|
||||||
while (tmp) {
|
|
||||||
#ifdef DEBUGLIST
|
|
||||||
ErrorF("strcmp(%x(%s),{%x} %x(%s))\n", module, module,
|
|
||||||
&(tmp->name), tmp->name, tmp->name);
|
|
||||||
#endif
|
|
||||||
if (!strcmp(module, tmp->name)) {
|
|
||||||
refCount[tmp->handle]++;
|
|
||||||
if (wasLoaded)
|
|
||||||
*wasLoaded = 1;
|
|
||||||
xf86MsgVerb(X_INFO, 2, "Reloading %s\n", module);
|
|
||||||
return tmp->handle;
|
|
||||||
}
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* OK, it's a new one. Add it.
|
|
||||||
*/
|
|
||||||
xf86Msg(X_INFO, "Loading %s\n", module);
|
xf86Msg(X_INFO, "Loading %s\n", module);
|
||||||
if (wasLoaded)
|
|
||||||
*wasLoaded = 0;
|
|
||||||
|
|
||||||
/*
|
if (!(ret = dlopen(module, DLOPEN_LAZY | DLOPEN_GLOBAL))) {
|
||||||
* Find a free handle.
|
xf86Msg(X_ERROR, "Failed to load %s: %s\n", module, dlerror());
|
||||||
*/
|
|
||||||
new_handle = 1;
|
|
||||||
while (new_handle < MAX_HANDLE && refCount[new_handle])
|
|
||||||
new_handle++;
|
|
||||||
|
|
||||||
if (new_handle == MAX_HANDLE) {
|
|
||||||
xf86Msg(X_ERROR, "Out of loader space\n"); /* XXX */
|
|
||||||
if (errmaj)
|
|
||||||
*errmaj = LDR_NOSPACE;
|
|
||||||
if (errmin)
|
|
||||||
*errmin = LDR_NOSPACE;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
refCount[new_handle] = 1;
|
|
||||||
|
|
||||||
tmp = _LoaderListPush();
|
|
||||||
tmp->name = strdup(module);
|
|
||||||
tmp->cname = strdup(cname);
|
|
||||||
tmp->handle = new_handle;
|
|
||||||
tmp->module = moduleseq++;
|
|
||||||
|
|
||||||
if ((tmp->private = DLLoadModule(tmp, flags)) == NULL) {
|
|
||||||
xf86Msg(X_ERROR, "Failed to load %s\n", module);
|
|
||||||
_LoaderListPop(new_handle);
|
|
||||||
refCount[new_handle] = 0;
|
|
||||||
if (errmaj)
|
if (errmaj)
|
||||||
*errmaj = LDR_NOLOAD;
|
*errmaj = LDR_NOLOAD;
|
||||||
if (errmin)
|
if (errmin)
|
||||||
*errmin = LDR_NOLOAD;
|
*errmin = LDR_NOLOAD;
|
||||||
return -1;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new_handle;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
LoaderHandleOpen(int handle)
|
|
||||||
{
|
|
||||||
if (handle < 0 || handle >= MAX_HANDLE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!refCount[handle])
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
refCount[handle]++;
|
|
||||||
return handle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
LoaderSymbol(const char *sym)
|
LoaderSymbol(const char *name)
|
||||||
{
|
{
|
||||||
return (DLFindSymbol(sym));
|
static void *global_scope = NULL;
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
p = dlsym(RTLD_DEFAULT, name);
|
||||||
|
if (p != NULL)
|
||||||
|
return p;
|
||||||
|
|
||||||
|
if (!global_scope)
|
||||||
|
global_scope = dlopen(NULL, DLOPEN_LAZY | DLOPEN_GLOBAL);
|
||||||
|
|
||||||
|
if (global_scope)
|
||||||
|
return dlsym(global_scope, name);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
void
|
||||||
LoaderUnload(int handle)
|
LoaderUnload(const char *name, void *handle)
|
||||||
{
|
{
|
||||||
loaderRec fakeHead;
|
xf86Msg(X_INFO, "Unloading %s\n", name);
|
||||||
loaderPtr tmp = &fakeHead;
|
dlclose(handle);
|
||||||
|
|
||||||
if (handle < 0 || handle >= MAX_HANDLE)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* check the reference count, only free it if it goes to zero
|
|
||||||
*/
|
|
||||||
if (--refCount[handle])
|
|
||||||
return 0;
|
|
||||||
/*
|
|
||||||
* find the loaderRecs associated with this handle.
|
|
||||||
*/
|
|
||||||
|
|
||||||
while ((tmp = _LoaderListPop(handle)) != NULL) {
|
|
||||||
xf86Msg(X_INFO, "Unloading %s\n", tmp->name);
|
|
||||||
DLUnloadModule(tmp->private);
|
|
||||||
free(tmp->name);
|
|
||||||
free(tmp->cname);
|
|
||||||
free(tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long LoaderOptions = 0;
|
unsigned long LoaderOptions = 0;
|
||||||
|
|
|
@ -57,23 +57,6 @@
|
||||||
#include <X11/Xfuncproto.h>
|
#include <X11/Xfuncproto.h>
|
||||||
#include <X11/Xmd.h>
|
#include <X11/Xmd.h>
|
||||||
|
|
||||||
/* LoadModule proc flags; LD_FLAG_GLOBAL adds symbols to global
|
|
||||||
* namespace, default is to keep symbols local to module. */
|
|
||||||
#define LD_FLAG_GLOBAL 1
|
|
||||||
|
|
||||||
typedef struct _loader *loaderPtr;
|
|
||||||
|
|
||||||
/* Each module loaded has a loaderRec */
|
|
||||||
typedef struct _loader {
|
|
||||||
int handle; /* Unique id used to remove symbols from
|
|
||||||
* this module when it is unloaded */
|
|
||||||
int module; /* Unique id to identify compilation units */
|
|
||||||
char *name;
|
|
||||||
char *cname;
|
|
||||||
void *private; /* format specific data */
|
|
||||||
loaderPtr next;
|
|
||||||
} loaderRec;
|
|
||||||
|
|
||||||
/* Compiled-in version information */
|
/* Compiled-in version information */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int xf86Version;
|
int xf86Version;
|
||||||
|
@ -88,10 +71,6 @@ extern const ModuleVersions LoaderVersionInfo;
|
||||||
extern unsigned long LoaderOptions;
|
extern unsigned long LoaderOptions;
|
||||||
|
|
||||||
/* Internal Functions */
|
/* Internal Functions */
|
||||||
int LoaderOpen(const char *, const char *, int, int *, int *, int *, int);
|
void * LoaderOpen(const char *, int *, int *);
|
||||||
int LoaderHandleOpen(int);
|
|
||||||
|
|
||||||
/* Loader backends. */
|
|
||||||
#include "dlloader.h"
|
|
||||||
|
|
||||||
#endif /* _LOADER_H */
|
#endif /* _LOADER_H */
|
||||||
|
|
|
@ -60,7 +60,8 @@ typedef struct module_desc {
|
||||||
struct module_desc *sib;
|
struct module_desc *sib;
|
||||||
struct module_desc *parent;
|
struct module_desc *parent;
|
||||||
char *name;
|
char *name;
|
||||||
int handle;
|
char *path;
|
||||||
|
void *handle;
|
||||||
ModuleSetupProc SetupProc;
|
ModuleSetupProc SetupProc;
|
||||||
ModuleTearDownProc TearDownProc;
|
ModuleTearDownProc TearDownProc;
|
||||||
void *TearDownData; /* returned from SetupProc */
|
void *TearDownData; /* returned from SetupProc */
|
||||||
|
@ -81,7 +82,7 @@ void UnloadDriver(ModuleDescPtr);
|
||||||
void LoaderSetPath(const char *path);
|
void LoaderSetPath(const char *path);
|
||||||
void LoaderSortExtensions(void);
|
void LoaderSortExtensions(void);
|
||||||
|
|
||||||
int LoaderUnload(int);
|
void LoaderUnload(const char *, void *);
|
||||||
unsigned long LoaderGetModuleVersion(ModuleDescPtr mod);
|
unsigned long LoaderGetModuleVersion(ModuleDescPtr mod);
|
||||||
|
|
||||||
void LoaderResetOptions(void);
|
void LoaderResetOptions(void);
|
||||||
|
|
|
@ -83,8 +83,7 @@ static char *LoaderGetCanonicalName(const char *, PatternPtr);
|
||||||
static void RemoveChild(ModuleDescPtr);
|
static void RemoveChild(ModuleDescPtr);
|
||||||
static ModuleDescPtr doLoadModule(const char *, const char *, const char **,
|
static ModuleDescPtr doLoadModule(const char *, const char *, const char **,
|
||||||
const char **, pointer,
|
const char **, pointer,
|
||||||
const XF86ModReqInfo *, int *, int *,
|
const XF86ModReqInfo *, int *, int *);
|
||||||
int flags);
|
|
||||||
|
|
||||||
const ModuleVersions LoaderVersionInfo = {
|
const ModuleVersions LoaderVersionInfo = {
|
||||||
XORG_VERSION_CURRENT,
|
XORG_VERSION_CURRENT,
|
||||||
|
@ -765,7 +764,7 @@ LoadSubModule(pointer _parent, const char *module,
|
||||||
}
|
}
|
||||||
|
|
||||||
submod = doLoadModule(module, NULL, subdirlist, patternlist, options,
|
submod = doLoadModule(module, NULL, subdirlist, patternlist, options,
|
||||||
modreq, errmaj, errmin, LD_FLAG_GLOBAL);
|
modreq, errmaj, errmin);
|
||||||
if (submod && submod != (ModuleDescPtr) 1) {
|
if (submod && submod != (ModuleDescPtr) 1) {
|
||||||
parent->child = AddSibling(parent->child, submod);
|
parent->child = AddSibling(parent->child, submod);
|
||||||
submod->parent = parent;
|
submod->parent = parent;
|
||||||
|
@ -776,18 +775,10 @@ LoadSubModule(pointer _parent, const char *module,
|
||||||
static ModuleDescPtr
|
static ModuleDescPtr
|
||||||
NewModuleDesc(const char *name)
|
NewModuleDesc(const char *name)
|
||||||
{
|
{
|
||||||
ModuleDescPtr mdp = malloc(sizeof(ModuleDesc));
|
ModuleDescPtr mdp = calloc(1, sizeof(ModuleDesc));
|
||||||
|
|
||||||
if (mdp) {
|
if (mdp)
|
||||||
mdp->child = NULL;
|
|
||||||
mdp->sib = NULL;
|
|
||||||
mdp->parent = NULL;
|
|
||||||
mdp->name = xstrdup(name);
|
mdp->name = xstrdup(name);
|
||||||
mdp->handle = -1;
|
|
||||||
mdp->SetupProc = NULL;
|
|
||||||
mdp->TearDownProc = NULL;
|
|
||||||
mdp->TearDownData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mdp;
|
return mdp;
|
||||||
}
|
}
|
||||||
|
@ -796,6 +787,7 @@ ModuleDescPtr
|
||||||
DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
|
DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
|
||||||
{
|
{
|
||||||
ModuleDescPtr ret;
|
ModuleDescPtr ret;
|
||||||
|
int errmaj, errmin;
|
||||||
|
|
||||||
if (!mod)
|
if (!mod)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -804,10 +796,11 @@ DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
|
||||||
if (ret == NULL)
|
if (ret == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (LoaderHandleOpen(mod->handle) == -1)
|
if (!(ret->handle = LoaderOpen(mod->path, &errmaj, &errmin))) {
|
||||||
return NULL;
|
free(ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ret->handle = mod->handle;
|
|
||||||
ret->SetupProc = mod->SetupProc;
|
ret->SetupProc = mod->SetupProc;
|
||||||
ret->TearDownProc = mod->TearDownProc;
|
ret->TearDownProc = mod->TearDownProc;
|
||||||
ret->TearDownData = NULL;
|
ret->TearDownData = NULL;
|
||||||
|
@ -815,6 +808,7 @@ DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent)
|
||||||
ret->sib = DuplicateModule(mod->sib, parent);
|
ret->sib = DuplicateModule(mod->sib, parent);
|
||||||
ret->parent = parent;
|
ret->parent = parent;
|
||||||
ret->VersionInfo = mod->VersionInfo;
|
ret->VersionInfo = mod->VersionInfo;
|
||||||
|
ret->path = strdup(mod->path);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -830,7 +824,7 @@ static ModuleDescPtr
|
||||||
doLoadModule(const char *module, const char *path, const char **subdirlist,
|
doLoadModule(const char *module, const char *path, const char **subdirlist,
|
||||||
const char **patternlist, pointer options,
|
const char **patternlist, pointer options,
|
||||||
const XF86ModReqInfo * modreq,
|
const XF86ModReqInfo * modreq,
|
||||||
int *errmaj, int *errmin, int flags)
|
int *errmaj, int *errmin)
|
||||||
{
|
{
|
||||||
XF86ModuleData *initdata = NULL;
|
XF86ModuleData *initdata = NULL;
|
||||||
char **pathlist = NULL;
|
char **pathlist = NULL;
|
||||||
|
@ -839,7 +833,6 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
|
||||||
char **path_elem = NULL;
|
char **path_elem = NULL;
|
||||||
char *p = NULL;
|
char *p = NULL;
|
||||||
ModuleDescPtr ret = NULL;
|
ModuleDescPtr ret = NULL;
|
||||||
int wasLoaded = 0;
|
|
||||||
PatternPtr patterns = NULL;
|
PatternPtr patterns = NULL;
|
||||||
int noncanonical = 0;
|
int noncanonical = 0;
|
||||||
char *m = NULL;
|
char *m = NULL;
|
||||||
|
@ -926,10 +919,10 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
|
||||||
*errmin = 0;
|
*errmin = 0;
|
||||||
goto LoadModule_fail;
|
goto LoadModule_fail;
|
||||||
}
|
}
|
||||||
ret->handle = LoaderOpen(found, name, 0,
|
ret->handle = LoaderOpen(found, errmaj, errmin);
|
||||||
errmaj, errmin, &wasLoaded, flags);
|
|
||||||
if (ret->handle < 0)
|
if (ret->handle < 0)
|
||||||
goto LoadModule_fail;
|
goto LoadModule_fail;
|
||||||
|
ret->path = strdup(found);
|
||||||
|
|
||||||
/* drop any explicit suffix from the module name */
|
/* drop any explicit suffix from the module name */
|
||||||
p = strchr(name, '.');
|
p = strchr(name, '.');
|
||||||
|
@ -960,26 +953,24 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
|
||||||
setup = initdata->setup;
|
setup = initdata->setup;
|
||||||
teardown = initdata->teardown;
|
teardown = initdata->teardown;
|
||||||
|
|
||||||
if (!wasLoaded) {
|
if (vers) {
|
||||||
if (vers) {
|
if (!CheckVersion(module, vers, modreq)) {
|
||||||
if (!CheckVersion(module, vers, modreq)) {
|
if (errmaj)
|
||||||
if (errmaj)
|
*errmaj = LDR_MISMATCH;
|
||||||
*errmaj = LDR_MISMATCH;
|
if (errmin)
|
||||||
if (errmin)
|
*errmin = 0;
|
||||||
*errmin = 0;
|
goto LoadModule_fail;
|
||||||
goto LoadModule_fail;
|
}
|
||||||
}
|
} else {
|
||||||
} else {
|
xf86Msg(X_ERROR,
|
||||||
xf86Msg(X_ERROR,
|
"LoadModule: Module %s does not supply"
|
||||||
"LoadModule: Module %s does not supply"
|
" version information\n", module);
|
||||||
" version information\n", module);
|
if (errmaj)
|
||||||
if (errmaj)
|
*errmaj = LDR_INVALID;
|
||||||
*errmaj = LDR_INVALID;
|
if (errmin)
|
||||||
if (errmin)
|
*errmin = 0;
|
||||||
*errmin = 0;
|
goto LoadModule_fail;
|
||||||
goto LoadModule_fail;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
if (setup)
|
if (setup)
|
||||||
ret->SetupProc = setup;
|
ret->SetupProc = setup;
|
||||||
if (teardown)
|
if (teardown)
|
||||||
|
@ -1067,7 +1058,7 @@ LoadModule(const char *module, const char *path, const char **subdirlist,
|
||||||
const XF86ModReqInfo * modreq, int *errmaj, int *errmin)
|
const XF86ModReqInfo * modreq, int *errmaj, int *errmin)
|
||||||
{
|
{
|
||||||
return doLoadModule(module, path, subdirlist, patternlist, options,
|
return doLoadModule(module, path, subdirlist, patternlist, options,
|
||||||
modreq, errmaj, errmin, LD_FLAG_GLOBAL);
|
modreq, errmaj, errmin);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1089,12 +1080,13 @@ UnloadModuleOrDriver(ModuleDescPtr mod)
|
||||||
|
|
||||||
if ((mod->TearDownProc) && (mod->TearDownData))
|
if ((mod->TearDownProc) && (mod->TearDownData))
|
||||||
mod->TearDownProc(mod->TearDownData);
|
mod->TearDownProc(mod->TearDownData);
|
||||||
LoaderUnload(mod->handle);
|
LoaderUnload(mod->name, mod->handle);
|
||||||
|
|
||||||
if (mod->child)
|
if (mod->child)
|
||||||
UnloadModuleOrDriver(mod->child);
|
UnloadModuleOrDriver(mod->child);
|
||||||
if (mod->sib)
|
if (mod->sib)
|
||||||
UnloadModuleOrDriver(mod->sib);
|
UnloadModuleOrDriver(mod->sib);
|
||||||
|
free(mod->path);
|
||||||
free(mod->name);
|
free(mod->name);
|
||||||
free(mod);
|
free(mod);
|
||||||
}
|
}
|
||||||
|
@ -1111,13 +1103,14 @@ UnloadSubModule(pointer _mod)
|
||||||
|
|
||||||
if ((mod->TearDownProc) && (mod->TearDownData))
|
if ((mod->TearDownProc) && (mod->TearDownData))
|
||||||
mod->TearDownProc(mod->TearDownData);
|
mod->TearDownProc(mod->TearDownData);
|
||||||
LoaderUnload(mod->handle);
|
LoaderUnload(mod->name, mod->handle);
|
||||||
|
|
||||||
RemoveChild(mod);
|
RemoveChild(mod);
|
||||||
|
|
||||||
if (mod->child)
|
if (mod->child)
|
||||||
UnloadModuleOrDriver(mod->child);
|
UnloadModuleOrDriver(mod->child);
|
||||||
|
|
||||||
|
free(mod->path);
|
||||||
free(mod->name);
|
free(mod->name);
|
||||||
free(mod);
|
free(mod);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
#include "xf86str.h"
|
#include "xf86str.h"
|
||||||
#include "vbe.h"
|
#include "vbe.h"
|
||||||
|
|
||||||
static MODULESETUPPROTO(vbeSetup);
|
|
||||||
|
|
||||||
static XF86ModuleVersionInfo vbeVersRec =
|
static XF86ModuleVersionInfo vbeVersRec =
|
||||||
{
|
{
|
||||||
"vbe",
|
"vbe",
|
||||||
|
@ -22,10 +20,4 @@ static XF86ModuleVersionInfo vbeVersRec =
|
||||||
{0,0,0,0}
|
{0,0,0,0}
|
||||||
};
|
};
|
||||||
|
|
||||||
_X_EXPORT XF86ModuleData vbeModuleData = { &vbeVersRec, vbeSetup, NULL };
|
_X_EXPORT XF86ModuleData vbeModuleData = { &vbeVersRec, NULL, NULL };
|
||||||
|
|
||||||
static pointer
|
|
||||||
vbeSetup(pointer module, pointer opts, int *errmaj, int *errmin)
|
|
||||||
{
|
|
||||||
return (pointer)1;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue