aio recvfrom was not null terminating the result
[jimtcl.git] / jim-load.c
blob7ce1fe29bca525ca52ad05b44966ca1846cd6131
1 #include <jim.h>
2 #include <string.h>
4 /* -----------------------------------------------------------------------------
5 * Dynamic libraries support (WIN32 not supported)
6 * ---------------------------------------------------------------------------*/
8 #ifdef JIM_DYNLIB
10 #include <dlfcn.h>
12 int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
14 Jim_Obj *libPathObjPtr;
15 int prefixc, i;
16 void *handle;
17 int (*onload) (Jim_Interp *interp);
19 libPathObjPtr = Jim_GetGlobalVariableStr(interp, JIM_LIBPATH, JIM_NONE);
20 if (libPathObjPtr == NULL) {
21 prefixc = 0;
22 libPathObjPtr = NULL;
24 else {
25 Jim_IncrRefCount(libPathObjPtr);
26 prefixc = Jim_ListLength(interp, libPathObjPtr);
29 for (i = -1; i < prefixc; i++) {
30 if (i < 0) {
31 handle = dlopen(pathName, RTLD_LAZY);
33 else {
34 FILE *fp;
35 char buf[JIM_PATH_LEN];
36 const char *prefix;
37 int prefixlen;
38 Jim_Obj *prefixObjPtr;
40 buf[0] = '\0';
41 if (Jim_ListIndex(interp, libPathObjPtr, i, &prefixObjPtr, JIM_NONE) != JIM_OK)
42 continue;
43 prefix = Jim_GetString(prefixObjPtr, &prefixlen);
44 if (prefixlen + strlen(pathName) + 1 >= JIM_PATH_LEN)
45 continue;
46 if (*pathName == '/') {
47 strcpy(buf, pathName);
49 else if (prefixlen && prefix[prefixlen - 1] == '/')
50 sprintf(buf, "%s%s", prefix, pathName);
51 else
52 sprintf(buf, "%s/%s", prefix, pathName);
53 fp = fopen(buf, "r");
54 if (fp == NULL)
55 continue;
56 fclose(fp);
57 handle = dlopen(buf, RTLD_LAZY);
59 if (handle == NULL) {
60 Jim_SetResultFormatted(interp, "error loading extension \"%s\": %s", pathName,
61 dlerror());
62 if (i < 0)
63 continue;
64 goto err;
67 /* Now, we use a unique init symbol depending on the extension name.
68 * This is done for compatibility between static and dynamic extensions.
69 * For extension readline.so, the init symbol is "Jim_readlineInit"
72 const char *pt;
73 const char *pkgname;
74 int pkgnamelen;
75 char initsym[50];
77 pt = strrchr(pathName, '/');
78 if (pt) {
79 pkgname = pt + 1;
81 else {
82 pkgname = pathName;
84 pt = strchr(pkgname, '.');
85 if (pt) {
86 pkgnamelen = pt - pkgname;
88 else {
89 pkgnamelen = strlen(pkgname);
91 snprintf(initsym, sizeof(initsym), "Jim_%.*sInit", pkgnamelen, pkgname);
93 if ((onload = dlsym(handle, initsym)) == NULL) {
94 Jim_SetResultFormatted(interp,
95 "No %s symbol found in extension %s", initsym, pathName);
96 goto err;
99 if (onload(interp) == JIM_ERR) {
100 dlclose(handle);
101 goto err;
103 Jim_SetEmptyResult(interp);
104 if (libPathObjPtr != NULL)
105 Jim_DecrRefCount(interp, libPathObjPtr);
106 return JIM_OK;
108 err:
109 if (libPathObjPtr != NULL)
110 Jim_DecrRefCount(interp, libPathObjPtr);
111 return JIM_ERR;
113 #else /* JIM_DYNLIB */
114 int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
116 JIM_NOTUSED(interp);
117 JIM_NOTUSED(pathName);
119 Jim_SetResultString(interp, "the Jim binary has no support for [load]", -1);
120 return JIM_ERR;
122 #endif /* JIM_DYNLIB */
124 /* [load] */
125 static int Jim_LoadCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
127 if (argc < 2) {
128 Jim_WrongNumArgs(interp, 1, argv, "libaryFile");
129 return JIM_ERR;
131 return Jim_LoadLibrary(interp, Jim_GetString(argv[1], NULL));
134 int Jim_loadInit(Jim_Interp *interp)
136 Jim_CreateCommand(interp, "load", Jim_LoadCoreCommand, NULL, NULL);
137 return JIM_OK;