void *sdf_extension_load(sdf_file_t *h) { sdf_extension_create_t *sdf_extension_create; void *p; h->sdf_extension_version = SDF_EXTENSION_VERSION; h->sdf_extension_revision = SDF_EXTENSION_REVISION; if (sdf_global_extension_failed) { h->error_message = "sdf_extension_load: failed to load extension."; return NULL; } if (sdf_global_extension) return sdf_global_extension; sdf_global_extension_dlhandle = dlopen("sdf_extension.so", RTLD_LAZY); if (!sdf_global_extension_dlhandle) { sdf_global_extension_failed = 1; h->error_message = dlerror(); return NULL; } // Weird pointer copying required by ISO C p = dlsym(sdf_global_extension_dlhandle, "sdf_extension_create"); memcpy(&sdf_extension_create, &p, sizeof(p)); sdf_global_extension = sdf_extension_create(h); return sdf_global_extension; }
void *sdf_extension_load(sdf_file_t *h) { #ifndef _WIN32 sdf_extension_create_t *sdf_extension_create; void *p; char *libname1 = "sdf_extension.so"; char *libname2 = "libsdf_extension.so"; char *path_env, *pathname, *path; char *sep = ":;,"; int len; struct stat sb; h->sdf_extension_version = SDF_EXTENSION_VERSION; h->sdf_extension_revision = SDF_EXTENSION_REVISION; if (sdf_global_extension_failed) { h->error_message = "sdf_extension_load: failed to load extension."; return NULL; } if (sdf_global_extension) return sdf_global_extension; /* * SDF_EXTENSION_PATH is a string separated by colon, semicolon or comma * Each substring is examined in turn. If it is a file then we attempt to * load it as a dynamic library. If it is a directory then we attempt to * load a file named "sdf_extension.so" or "libsdf_extension.so" in that * directory. The routine exits once a valid library is found. */ path_env = getenv("SDF_EXTENSION_PATH"); if (path_env) { len = strlen(path_env) + strlen(libname1) + strlen(libname2) + 2; pathname = malloc(len); for (path = strtok(path_env, sep); path; path = strtok(NULL, sep)) { stat(path, &sb); if (S_ISDIR(sb.st_mode)) { snprintf(pathname, len, "%s/%s", path, libname1); sdf_global_extension_dlhandle = dlopen(pathname, RTLD_LAZY); if (!sdf_global_extension_dlhandle) { snprintf(pathname, len, "%s/%s", path, libname2); sdf_global_extension_dlhandle = dlopen(pathname, RTLD_LAZY); } } else if (S_ISREG(sb.st_mode)) { sdf_global_extension_dlhandle = dlopen(path, RTLD_LAZY); } if (sdf_global_extension_dlhandle) break; } free(pathname); } if (!sdf_global_extension_dlhandle) { sdf_global_extension_dlhandle = dlopen(libname1, RTLD_LAZY); if (!sdf_global_extension_dlhandle) sdf_global_extension_dlhandle = dlopen(libname2, RTLD_LAZY); } if (!sdf_global_extension_dlhandle) { sdf_global_extension_failed = 1; h->error_message = dlerror(); return NULL; } // Weird pointer copying required by ISO C p = dlsym(sdf_global_extension_dlhandle, "sdf_extension_create"); memcpy(&sdf_extension_create, &p, sizeof(p)); sdf_global_extension = sdf_extension_create(h); return sdf_global_extension; #endif }