summaryrefslogtreecommitdiffstats
path: root/Src/module.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-04-15 18:06:33 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-04-15 18:06:33 +0000
commita61dc2074ae6cd00f1c166dc0102c491db056060 (patch)
treeb5661a235ec55353b97c617554baf14158c91ea8 /Src/module.c
parentzsh-3.1.5 (diff)
downloadzsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar.gz
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar.bz2
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar.lz
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar.xz
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.tar.zst
zsh-a61dc2074ae6cd00f1c166dc0102c491db056060.zip
zsh-3.1.5-pws-1zsh-3.1.5-pws-1
Diffstat (limited to 'Src/module.c')
-rw-r--r--Src/module.c136
1 files changed, 99 insertions, 37 deletions
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 <sys/ldr.h>
+
+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 <dlfcn.h>
#else
@@ -168,12 +206,6 @@ deletebuiltins(char const *nam, Builtin binl, int size)
# include <nlist.h>
# include <link.h>
#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)
@@ -289,6 +349,39 @@ init_module(Module 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;
+}
+
+#endif /* !AIXDYNAMIC */
+
+/**/
Module
load_module(char const *name)
{
@@ -338,37 +431,6 @@ load_module(char const *name)
}
/**/
-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)
{