From a61dc2074ae6cd00f1c166dc0102c491db056060 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Thu, 15 Apr 1999 18:06:33 +0000 Subject: zsh-3.1.5-pws-1 --- Src/module.c | 136 +++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 99 insertions(+), 37 deletions(-) (limited to 'Src/module.c') diff --git a/Src/module.c b/Src/module.c index ce5989f07..91687a21d 100644 --- a/Src/module.c +++ b/Src/module.c @@ -161,6 +161,44 @@ deletebuiltins(char const *nam, Builtin binl, int size) return hadf ? hads : 1; } +#ifdef AIXDYNAMIC + +#include + +static char *dlerrstr[256]; + +/**/ +static void * +load_and_bind(const char *fn) +{ + void *ret = (void *) load((char *) fn, L_NOAUTODEFER, NULL); + + if (ret) { + LinkNode node; + int err = loadbind(0, (void *) addbuiltin, ret); + for (node = firstnode(modules); !err && node; incnode(node)) { + Module m = (Module) getdata(node); + if (m->handle) + err |= loadbind(0, m->handle, ret); + } + + if (err) { + loadquery(L_GETMESSAGES, dlerrstr, sizeof(dlerrstr)); + unload(ret); + ret = NULL; + } + } else + loadquery(L_GETMESSAGES, dlerrstr, sizeof(dlerrstr)); + + return ret; +} + +#define dlopen(X,Y) load_and_bind(X) +#define dlclose(X) unload(X) +#define dlerror() (dlerrstr[0]) + +#else + #ifdef HAVE_DLFCN_H # include #else @@ -168,12 +206,6 @@ deletebuiltins(char const *nam, Builtin binl, int size) # include # include #endif -#ifndef RTLD_LAZY -# define RTLD_LAZY 1 -#endif -#ifndef RTLD_GLOBAL -# define RTLD_GLOBAL 0 -#endif #ifndef HAVE_DLCLOSE # define dlclose(X) ((X), 0) #endif @@ -189,6 +221,16 @@ deletebuiltins(char const *nam, Builtin binl, int size) # define STR_CLEANUP "cleanup_" # define STR_CLEANUP_S "cleanup_%s" #endif /* !DLSYM_NEEDS_UNDERSCORE */ + +#endif /* !AIXDYNAMIC */ + +#ifndef RTLD_LAZY +# define RTLD_LAZY 1 +#endif +#ifndef RTLD_GLOBAL +# define RTLD_GLOBAL 0 +#endif + typedef int (*Module_func) _((Module)); /**/ @@ -257,6 +299,24 @@ find_module(const char *name) return NULL; } +#ifdef AIXDYNAMIC + +/**/ +static int +init_module(Module m) +{ + return ((int (*)_((int,Module))) m->handle)(1, m); +} + +/**/ +static int +cleanup_module(Module m) +{ + return ((int (*)_((int,Module))) m->handle)(0, m); +} + +#else + /**/ static int init_module(Module m) @@ -288,6 +348,39 @@ init_module(Module m) return 1; } +/**/ +static int +cleanup_module(Module m) +{ + char *s, *t; +#ifndef DYNAMIC_NAME_CLASH_OK + char buf[PATH_MAX + 1]; +#endif + Module_func fn; + + s = strrchr(m->nam, '/'); + if (s) + s = dupstring(++s); + else + s = m->nam; + if ((t = strrchr(s, '.'))) + *t = '\0'; +#ifdef DYNAMIC_NAME_CLASH_OK + fn = (Module_func) dlsym(m->handle, STR_CLEANUP); +#else /* !DYNAMIC_NAME_CLASH_OK */ + if (strlen(s) + 9 > PATH_MAX) + return 1; + sprintf(buf, STR_CLEANUP_S, s); + fn = (Module_func) dlsym(m->handle, buf); +#endif /* !DYNAMIC_NAME_CLASH_OK */ + if(fn) + return fn(m); + zwarnnam(m->nam, "no cleanup function", NULL, 0); + return 1; +} + +#endif /* !AIXDYNAMIC */ + /**/ Module load_module(char const *name) @@ -337,37 +430,6 @@ load_module(char const *name) return m; } -/**/ -static int -cleanup_module(Module m) -{ - char *s, *t; -#ifndef DYNAMIC_NAME_CLASH_OK - char buf[PATH_MAX + 1]; -#endif - Module_func fn; - - s = strrchr(m->nam, '/'); - if (s) - s = dupstring(++s); - else - s = m->nam; - if ((t = strrchr(s, '.'))) - *t = '\0'; -#ifdef DYNAMIC_NAME_CLASH_OK - fn = (Module_func) dlsym(m->handle, STR_CLEANUP); -#else /* !DYNAMIC_NAME_CLASH_OK */ - if (strlen(s) + 9 > PATH_MAX) - return 1; - sprintf(buf, STR_CLEANUP_S, s); - fn = (Module_func) dlsym(m->handle, buf); -#endif /* !DYNAMIC_NAME_CLASH_OK */ - if(fn) - return fn(m); - zwarnnam(m->nam, "no cleanup function", NULL, 0); - return 1; -} - /**/ void add_dep(char *name, char *from) -- cgit 1.4.1