X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmodule.c;h=c31ce8d4d948c6f1edd5c00751bebcc7cb6ac2fe;hp=a657aedd2f2cf95b32699040f4550cfe48629901;hb=3b44aae43e81d56d0686d2dee8b1ded3c277f2fd;hpb=b78637d9020222f1032349f231c0dc84a69797bc diff --git a/src/module.c b/src/module.c index a657aed..c31ce8d 100644 --- a/src/module.c +++ b/src/module.c @@ -198,9 +198,32 @@ static PHP_FUNCTION(psi_validate_string) free(I); } -static PHP_MINIT_FUNCTION(psi) +static ZEND_RESULT_CODE psi_ops_load() { struct psi_context_ops *ops = NULL; +#ifdef HAVE_LIBJIT + if (!strcasecmp(PSI_G(engine), "jit")) { + ops = psi_libjit_ops(); + } else +#endif +#ifdef HAVE_LIBFFI + ops = psi_libffi_ops(); +#endif + + if (!ops) { + php_error(E_WARNING, "No PSI engine found"); + return FAILURE; + } + + PSI_G(ops) = ops; + if (ops->load) { + return ops->load(); + } + return SUCCESS; +} + +static PHP_MINIT_FUNCTION(psi) +{ zend_class_entry ce = {0}; unsigned flags = 0; @@ -218,17 +241,7 @@ static PHP_MINIT_FUNCTION(psi) psi_object_handlers.free_obj = psi_object_free; psi_object_handlers.clone_obj = NULL; -#ifdef HAVE_LIBJIT - if (!strcasecmp(PSI_G(engine), "jit")) { - ops = psi_libjit_ops(); - } else -#endif -#ifdef HAVE_LIBFFI - ops = psi_libffi_ops(); -#endif - - if (!ops) { - php_error(E_WARNING, "No PSI engine found"); + if (SUCCESS != psi_ops_load()) { return FAILURE; } @@ -242,7 +255,7 @@ static PHP_MINIT_FUNCTION(psi) PSI_G(search_path) = pemalloc(strlen(PSI_G(directory)) + strlen(psi_cpp_search) + 1 + 1, 1); sprintf(PSI_G(search_path), "%s:%s", PSI_G(directory), psi_cpp_search); - PSI_G(context) = psi_context_init(NULL, ops, psi_error_wrapper, flags); + PSI_G(context) = psi_context_init(NULL, PSI_G(ops), psi_error_wrapper, flags); psi_context_build(PSI_G(context), PSI_G(directory)); return SUCCESS; @@ -256,6 +269,10 @@ static PHP_MSHUTDOWN_FUNCTION(psi) psi_context_free(&PSI_G(context)); + if (PSI_G(ops)->free) { + PSI_G(ops)->free(); + } + UNREGISTER_INI_ENTRIES(); return SUCCESS; @@ -320,15 +337,19 @@ static PHP_GINIT_FUNCTION(psi) BL_DECL_ADD("alloca"); BL_DECL_ADD("atexit"); BL_DECL_ADD("at_quick_exit"); + + /* missing */ BL_DECL_ADD("_IO_cookie_init"); + BL_DECL_ADD("bindresvport6"); /* va_list as arg */ BL_DECL_ADD("*v*printf"); BL_DECL_ADD("*v*scanf"); + BL_DECL_ADD("vsyslog"); /* LFS/LFO for 32bit */ - BL_DECL_ADD("*stat64"); - BL_DECL_ADD("*statat64"); + BL_DECL_ADD("*stat*64"); + BL_DECL_ADD("*glob*64"); /* Hurd only */ BL_DECL_ADD("getumask"); }