X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fdecl_file.c;h=c8622dba590cf0b95cfbb20b76570f0d9c17284b;hp=c42570540722774031b2314c76182e0103c140da;hb=02e801eabbe26a129ea05e6723c94e10bb653dab;hpb=b282753558305fe44bd0d268833e131e5ccf82e8 diff --git a/src/types/decl_file.c b/src/types/decl_file.c index c425705..c8622db 100644 --- a/src/types/decl_file.c +++ b/src/types/decl_file.c @@ -30,44 +30,63 @@ void psi_decl_file_dtor(struct psi_decl_file *file) { - if (file->ln) { - free(file->ln); + if (file->libnames) { + psi_plist_free(file->libnames); } - if (file->fn) { - free(file->fn); + if (file->dlopened) { + psi_plist_free(file->dlopened); + } + if (file->filename) { + free(file->filename); } memset(file, 0, sizeof(*file)); } -bool psi_decl_file_validate(struct psi_data *dst, struct psi_data *src, void **dlopened) +static inline bool validate_lib(struct psi_data *dst, const char *libname, void **dlopened) { char lib[MAXPATHLEN]; - const char *ptr = src->file.ln; size_t len; - if (!ptr) { + if (!libname) { /* FIXME: assume stdlib */ return true; - } else if (!strchr(ptr, '/')) { - len = snprintf(lib, MAXPATHLEN, "lib%s.%s", ptr, PHP_PSI_SHLIB_SUFFIX); + } else if (!strchr(libname, '/')) { + len = snprintf(lib, MAXPATHLEN, "lib%s.%s", libname, PHP_PSI_SHLIB_SUFFIX); if (MAXPATHLEN == len) { dst->error(dst, NULL, PSI_WARNING, "Library name too long: '%s'", - ptr); + libname); } lib[len] = 0; - ptr = lib; + libname = lib; } - if (!(*dlopened = dlopen(ptr, RTLD_LAZY | RTLD_LOCAL))) { + if (!(*dlopened = dlopen(libname, RTLD_LAZY | RTLD_LOCAL))) { dst->error(dst, NULL, PSI_WARNING, "Could not open library '%s': %s.", - src->file.ln, dlerror()); + libname, dlerror()); return false; } - if (!dst->libs) { - dst->libs = psi_plist_init((psi_plist_dtor) psi_libs_free); + return true; +} + +bool psi_decl_file_validate(struct psi_data *dst, struct psi_data *src) +{ + size_t i = 0; + char *libname; + void *dlopened; + + while (psi_plist_get(src->file.libnames, i++, &libname)) { + if (!validate_lib(dst, libname, &dlopened)) { + return false; + } + + libname = strdup(libname); + dst->file.libnames = psi_plist_add(dst->file.libnames, &libname); + dst->file.dlopened = psi_plist_add(dst->file.dlopened, &dlopened); } - dst->libs = psi_plist_add(dst->libs, dlopened); + if (src->file.filename) { + dst->file.filename = strdup(src->file.filename); + } return true; } @@ -76,3 +95,9 @@ void psi_libs_free(void **dlopened) { dlclose(*dlopened); } } + +void psi_names_free(char **name) { + if (*name) { + free(*name); + } +}