version 1.1.1.1, 2012/02/21 23:47:57
|
version 1.1.1.2, 2012/05/29 12:34:40
|
Line 26
|
Line 26
|
#endif |
#endif |
|
|
#include "php.h" |
#include "php.h" |
|
#include "SAPI.h" |
|
|
#define PHP_XML_INTERNAL |
#define PHP_XML_INTERNAL |
#include "zend_variables.h" |
#include "zend_variables.h" |
Line 53
|
Line 54
|
|
|
/* a true global for initialization */ |
/* a true global for initialization */ |
static int _php_libxml_initialized = 0; |
static int _php_libxml_initialized = 0; |
|
static int _php_libxml_per_request_initialization = 1; |
|
static xmlExternalEntityLoader _php_libxml_default_entity_loader; |
|
|
typedef struct _php_libxml_func_handler { |
typedef struct _php_libxml_func_handler { |
php_libxml_export_node export_func; |
php_libxml_export_node export_func; |
Line 68 static PHP_FUNCTION(libxml_use_internal_errors);
|
Line 71 static PHP_FUNCTION(libxml_use_internal_errors);
|
static PHP_FUNCTION(libxml_get_last_error); |
static PHP_FUNCTION(libxml_get_last_error); |
static PHP_FUNCTION(libxml_clear_errors); |
static PHP_FUNCTION(libxml_clear_errors); |
static PHP_FUNCTION(libxml_get_errors); |
static PHP_FUNCTION(libxml_get_errors); |
|
static PHP_FUNCTION(libxml_set_external_entity_loader); |
static PHP_FUNCTION(libxml_disable_entity_loader); |
static PHP_FUNCTION(libxml_disable_entity_loader); |
|
|
static zend_class_entry *libxmlerror_class_entry; |
static zend_class_entry *libxmlerror_class_entry; |
Line 82 ZEND_GET_MODULE(libxml)
|
Line 86 ZEND_GET_MODULE(libxml)
|
static PHP_MINIT_FUNCTION(libxml); |
static PHP_MINIT_FUNCTION(libxml); |
static PHP_RINIT_FUNCTION(libxml); |
static PHP_RINIT_FUNCTION(libxml); |
static PHP_MSHUTDOWN_FUNCTION(libxml); |
static PHP_MSHUTDOWN_FUNCTION(libxml); |
static PHP_RSHUTDOWN_FUNCTION(libxml); |
|
static PHP_MINFO_FUNCTION(libxml); |
static PHP_MINFO_FUNCTION(libxml); |
|
static int php_libxml_post_deactivate(); |
|
|
/* }}} */ |
/* }}} */ |
|
|
Line 109 ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_disable_entity_l
|
Line 113 ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_disable_entity_l
|
ZEND_ARG_INFO(0, disable) |
ZEND_ARG_INFO(0, disable) |
ZEND_END_ARG_INFO() |
ZEND_END_ARG_INFO() |
|
|
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_set_external_entity_loader, 0, 0, 1) |
|
ZEND_ARG_INFO(0, resolver_function) |
|
ZEND_END_ARG_INFO() |
/* }}} */ |
/* }}} */ |
|
|
/* {{{ extension definition structures */ |
/* {{{ extension definition structures */ |
Line 119 static const zend_function_entry libxml_functions[] =
|
Line 126 static const zend_function_entry libxml_functions[] =
|
PHP_FE(libxml_clear_errors, arginfo_libxml_clear_errors) |
PHP_FE(libxml_clear_errors, arginfo_libxml_clear_errors) |
PHP_FE(libxml_get_errors, arginfo_libxml_get_errors) |
PHP_FE(libxml_get_errors, arginfo_libxml_get_errors) |
PHP_FE(libxml_disable_entity_loader, arginfo_libxml_disable_entity_loader) |
PHP_FE(libxml_disable_entity_loader, arginfo_libxml_disable_entity_loader) |
|
PHP_FE(libxml_set_external_entity_loader, arginfo_libxml_set_external_entity_loader) |
PHP_FE_END |
PHP_FE_END |
}; |
}; |
|
|
Line 129 zend_module_entry libxml_module_entry = {
|
Line 137 zend_module_entry libxml_module_entry = {
|
PHP_MINIT(libxml), /* extension-wide startup function */ |
PHP_MINIT(libxml), /* extension-wide startup function */ |
PHP_MSHUTDOWN(libxml), /* extension-wide shutdown function */ |
PHP_MSHUTDOWN(libxml), /* extension-wide shutdown function */ |
PHP_RINIT(libxml), /* per-request startup function */ |
PHP_RINIT(libxml), /* per-request startup function */ |
PHP_RSHUTDOWN(libxml), /* per-request shutdown function */ | NULL, /* per-request shutdown function */ |
PHP_MINFO(libxml), /* information function */ |
PHP_MINFO(libxml), /* information function */ |
NO_VERSION_YET, |
NO_VERSION_YET, |
PHP_MODULE_GLOBALS(libxml), /* globals descriptor */ |
PHP_MODULE_GLOBALS(libxml), /* globals descriptor */ |
PHP_GINIT(libxml), /* globals ctor */ |
PHP_GINIT(libxml), /* globals ctor */ |
NULL, /* globals dtor */ |
NULL, /* globals dtor */ |
NULL, /* post deactivate */ | php_libxml_post_deactivate, /* post deactivate */ |
STANDARD_MODULE_PROPERTIES_EX |
STANDARD_MODULE_PROPERTIES_EX |
}; |
}; |
|
|
Line 261 static PHP_GINIT_FUNCTION(libxml)
|
Line 269 static PHP_GINIT_FUNCTION(libxml)
|
libxml_globals->stream_context = NULL; |
libxml_globals->stream_context = NULL; |
libxml_globals->error_buffer.c = NULL; |
libxml_globals->error_buffer.c = NULL; |
libxml_globals->error_list = NULL; |
libxml_globals->error_list = NULL; |
|
libxml_globals->entity_loader.fci.size = 0; |
} |
} |
|
|
|
static void _php_libxml_destroy_fci(zend_fcall_info *fci) |
|
{ |
|
if (fci->size > 0) { |
|
zval_ptr_dtor(&fci->function_name); |
|
if (fci->object_ptr != NULL) { |
|
zval_ptr_dtor(&fci->object_ptr); |
|
} |
|
fci->size = 0; |
|
} |
|
} |
|
|
/* Channel libxml file io layer through the PHP streams subsystem. |
/* Channel libxml file io layer through the PHP streams subsystem. |
* This allows use of ftps:// and https:// urls */ |
* This allows use of ftps:// and https:// urls */ |
|
|
Line 278 static void *php_libxml_streams_IO_open_wrapper(const
|
Line 298 static void *php_libxml_streams_IO_open_wrapper(const
|
|
|
TSRMLS_FETCH(); |
TSRMLS_FETCH(); |
|
|
uri = xmlParseURI((xmlChar *)filename); | uri = xmlParseURI(filename); |
if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) { | if (uri && (uri->scheme == NULL || |
| (xmlStrncmp(BAD_CAST uri->scheme, BAD_CAST "file", 4) == 0))) { |
resolved_path = xmlURIUnescapeString(filename, 0, NULL); |
resolved_path = xmlURIUnescapeString(filename, 0, NULL); |
isescaped = 1; |
isescaped = 1; |
} else { |
} else { |
Line 300 static void *php_libxml_streams_IO_open_wrapper(const
|
Line 321 static void *php_libxml_streams_IO_open_wrapper(const
|
that the streams layer puts out at times, but for libxml we |
that the streams layer puts out at times, but for libxml we |
may try to open files that don't exist, but it is not a failure |
may try to open files that don't exist, but it is not a failure |
in xml processing (eg. DTD files) */ |
in xml processing (eg. DTD files) */ |
wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, ENFORCE_SAFE_MODE TSRMLS_CC); | wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, 0 TSRMLS_CC); |
if (wrapper && read_only && wrapper->wops->url_stat) { |
if (wrapper && read_only && wrapper->wops->url_stat) { |
if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) { |
if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) { |
if (isescaped) { |
if (isescaped) { |
Line 311 static void *php_libxml_streams_IO_open_wrapper(const
|
Line 332 static void *php_libxml_streams_IO_open_wrapper(const
|
} |
} |
|
|
context = php_stream_context_from_zval(LIBXML(stream_context), 0); |
context = php_stream_context_from_zval(LIBXML(stream_context), 0); |
| |
ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, context); | ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, REPORT_ERRORS, NULL, context); |
if (isescaped) { |
if (isescaped) { |
xmlFree(resolved_path); |
xmlFree(resolved_path); |
} |
} |
Line 528 static void php_libxml_internal_error_handler(int erro
|
Line 549 static void php_libxml_internal_error_handler(int erro
|
} |
} |
} |
} |
|
|
|
static xmlParserInputPtr _php_libxml_external_entity_loader(const char *URL, |
|
const char *ID, xmlParserCtxtPtr context) |
|
{ |
|
xmlParserInputPtr ret = NULL; |
|
const char *resource = NULL; |
|
zval *public = NULL, |
|
*system = NULL, |
|
*ctxzv = NULL, |
|
**params[] = {&public, &system, &ctxzv}, |
|
*retval_ptr = NULL; |
|
int retval; |
|
zend_fcall_info *fci; |
|
TSRMLS_FETCH(); |
|
|
|
fci = &LIBXML(entity_loader).fci; |
|
|
|
if (fci->size == 0) { |
|
/* no custom user-land callback set up; delegate to original loader */ |
|
return _php_libxml_default_entity_loader(URL, ID, context); |
|
} |
|
|
|
ALLOC_INIT_ZVAL(public); |
|
if (ID != NULL) { |
|
ZVAL_STRING(public, ID, 1); |
|
} |
|
ALLOC_INIT_ZVAL(system); |
|
if (URL != NULL) { |
|
ZVAL_STRING(system, URL, 1); |
|
} |
|
MAKE_STD_ZVAL(ctxzv); |
|
array_init_size(ctxzv, 4); |
|
|
|
#define ADD_NULL_OR_STRING_KEY(memb) \ |
|
if (context->memb == NULL) { \ |
|
add_assoc_null_ex(ctxzv, #memb, sizeof(#memb)); \ |
|
} else { \ |
|
add_assoc_string_ex(ctxzv, #memb, sizeof(#memb), \ |
|
(char *)context->memb, 1); \ |
|
} |
|
|
|
ADD_NULL_OR_STRING_KEY(directory) |
|
ADD_NULL_OR_STRING_KEY(intSubName) |
|
ADD_NULL_OR_STRING_KEY(extSubURI) |
|
ADD_NULL_OR_STRING_KEY(extSubSystem) |
|
|
|
#undef ADD_NULL_OR_STRING_KEY |
|
|
|
fci->retval_ptr_ptr = &retval_ptr; |
|
fci->params = params; |
|
fci->param_count = sizeof(params)/sizeof(*params); |
|
fci->no_separation = 1; |
|
|
|
retval = zend_call_function(fci, &LIBXML(entity_loader).fcc TSRMLS_CC); |
|
if (retval != SUCCESS || fci->retval_ptr_ptr == NULL) { |
|
php_libxml_ctx_error(context, |
|
"Call to user entity loader callback '%s' has failed", |
|
fci->function_name); |
|
} else { |
|
retval_ptr = *fci->retval_ptr_ptr; |
|
if (retval_ptr == NULL) { |
|
php_libxml_ctx_error(context, |
|
"Call to user entity loader callback '%s' has failed; " |
|
"probably it has thrown an exception", |
|
fci->function_name); |
|
} else if (Z_TYPE_P(retval_ptr) == IS_STRING) { |
|
is_string: |
|
resource = Z_STRVAL_P(retval_ptr); |
|
} else if (Z_TYPE_P(retval_ptr) == IS_RESOURCE) { |
|
php_stream *stream; |
|
php_stream_from_zval_no_verify(stream, &retval_ptr); |
|
if (stream == NULL) { |
|
php_libxml_ctx_error(context, |
|
"The user entity loader callback '%s' has returned a " |
|
"resource, but it is not a stream", |
|
fci->function_name); |
|
} else { |
|
/* TODO: allow storing the encoding in the stream context? */ |
|
xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; |
|
xmlParserInputBufferPtr pib = xmlAllocParserInputBuffer(enc); |
|
if (pib == NULL) { |
|
php_libxml_ctx_error(context, "Could not allocate parser " |
|
"input buffer"); |
|
} else { |
|
/* make stream not being closed when the zval is freed */ |
|
zend_list_addref(stream->rsrc_id); |
|
pib->context = stream; |
|
pib->readcallback = php_libxml_streams_IO_read; |
|
pib->closecallback = php_libxml_streams_IO_close; |
|
|
|
ret = xmlNewIOInputStream(context, pib, enc); |
|
if (ret == NULL) { |
|
xmlFreeParserInputBuffer(pib); |
|
} |
|
} |
|
} |
|
} else if (Z_TYPE_P(retval_ptr) != IS_NULL) { |
|
/* retval not string nor resource nor null; convert to string */ |
|
SEPARATE_ZVAL(&retval_ptr); |
|
convert_to_string(retval_ptr); |
|
goto is_string; |
|
} /* else is null; don't try anything */ |
|
} |
|
|
|
if (ret == NULL) { |
|
if (resource == NULL) { |
|
if (ID == NULL) { |
|
ID = "NULL"; |
|
} |
|
php_libxml_ctx_error(context, |
|
"Failed to load external entity \"%s\"\n", ID); |
|
} else { |
|
/* we got the resource in the form of a string; open it */ |
|
ret = xmlNewInputFromFile(context, resource); |
|
} |
|
} |
|
|
|
zval_ptr_dtor(&public); |
|
zval_ptr_dtor(&system); |
|
zval_ptr_dtor(&ctxzv); |
|
if (retval_ptr != NULL) { |
|
zval_ptr_dtor(&retval_ptr); |
|
} |
|
return ret; |
|
} |
|
|
|
static xmlParserInputPtr _php_libxml_pre_ext_ent_loader(const char *URL, |
|
const char *ID, xmlParserCtxtPtr context) |
|
{ |
|
/* Check whether we're running in a PHP context, since the entity loader |
|
* we've defined is an application level (true global) setting */ |
|
if (xmlGenericError == php_libxml_error_handler) { |
|
return _php_libxml_external_entity_loader(URL, ID, context); |
|
} else { |
|
return _php_libxml_default_entity_loader(URL, ID, context); |
|
} |
|
} |
|
|
PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...) |
PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...) |
{ |
{ |
va_list args; |
va_list args; |
Line 565 PHP_LIBXML_API void php_libxml_initialize(void)
|
Line 723 PHP_LIBXML_API void php_libxml_initialize(void)
|
if (!_php_libxml_initialized) { |
if (!_php_libxml_initialized) { |
/* we should be the only one's to ever init!! */ |
/* we should be the only one's to ever init!! */ |
xmlInitParser(); |
xmlInitParser(); |
|
|
|
_php_libxml_default_entity_loader = xmlGetExternalEntityLoader(); |
|
xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader); |
|
|
zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1); |
zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1); |
|
|
Line 580 PHP_LIBXML_API void php_libxml_shutdown(void)
|
Line 741 PHP_LIBXML_API void php_libxml_shutdown(void)
|
#endif |
#endif |
xmlCleanupParser(); |
xmlCleanupParser(); |
zend_hash_destroy(&php_libxml_exports); |
zend_hash_destroy(&php_libxml_exports); |
|
|
|
xmlSetExternalEntityLoader(_php_libxml_default_entity_loader); |
_php_libxml_initialized = 0; |
_php_libxml_initialized = 0; |
} |
} |
} |
} |
Line 616 static PHP_MINIT_FUNCTION(libxml)
|
Line 779 static PHP_MINIT_FUNCTION(libxml)
|
REGISTER_LONG_CONSTANT("LIBXML_NSCLEAN", XML_PARSE_NSCLEAN, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NSCLEAN", XML_PARSE_NSCLEAN, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NOCDATA", XML_PARSE_NOCDATA, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NOCDATA", XML_PARSE_NOCDATA, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NONET", XML_PARSE_NONET, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NONET", XML_PARSE_NONET, CONST_CS | CONST_PERSISTENT); |
|
REGISTER_LONG_CONSTANT("LIBXML_PEDANTIC", XML_PARSE_PEDANTIC, CONST_CS | CONST_PERSISTENT); |
#if LIBXML_VERSION >= 20621 |
#if LIBXML_VERSION >= 20621 |
REGISTER_LONG_CONSTANT("LIBXML_COMPACT", XML_PARSE_COMPACT, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_COMPACT", XML_PARSE_COMPACT, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL", XML_SAVE_NO_DECL, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL", XML_SAVE_NO_DECL, CONST_CS | CONST_PERSISTENT); |
Line 625 static PHP_MINIT_FUNCTION(libxml)
|
Line 789 static PHP_MINIT_FUNCTION(libxml)
|
#endif |
#endif |
REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG", LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG", LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT); |
|
|
|
/* Additional constants for use with loading html */ |
|
#if LIBXML_VERSION >= 20707 |
|
REGISTER_LONG_CONSTANT("LIBXML_HTML_NOIMPLIED", HTML_PARSE_NOIMPLIED, CONST_CS | CONST_PERSISTENT); |
|
#endif |
|
|
|
#if LIBXML_VERSION >= 20708 |
|
REGISTER_LONG_CONSTANT("LIBXML_HTML_NODEFDTD", HTML_PARSE_NODEFDTD, CONST_CS | CONST_PERSISTENT); |
|
#endif |
|
|
/* Error levels */ |
/* Error levels */ |
REGISTER_LONG_CONSTANT("LIBXML_ERR_NONE", XML_ERR_NONE, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_ERR_NONE", XML_ERR_NONE, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_ERR_WARNING", XML_ERR_WARNING, CONST_CS | CONST_PERSISTENT); |
REGISTER_LONG_CONSTANT("LIBXML_ERR_WARNING", XML_ERR_WARNING, CONST_CS | CONST_PERSISTENT); |
Line 634 static PHP_MINIT_FUNCTION(libxml)
|
Line 807 static PHP_MINIT_FUNCTION(libxml)
|
INIT_CLASS_ENTRY(ce, "LibXMLError", NULL); |
INIT_CLASS_ENTRY(ce, "LibXMLError", NULL); |
libxmlerror_class_entry = zend_register_internal_class(&ce TSRMLS_CC); |
libxmlerror_class_entry = zend_register_internal_class(&ce TSRMLS_CC); |
|
|
|
if (sapi_module.name) { |
|
static const char * const supported_sapis[] = { |
|
"cgi-fcgi", |
|
"fpm-fcgi", |
|
"litespeed", |
|
NULL |
|
}; |
|
const char * const *sapi_name; |
|
|
|
for (sapi_name = supported_sapis; *sapi_name; sapi_name++) { |
|
if (strcmp(sapi_module.name, *sapi_name) == 0) { |
|
_php_libxml_per_request_initialization = 0; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
if (!_php_libxml_per_request_initialization) { |
|
/* report errors via handler rather than stderr */ |
|
xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); |
|
xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename); |
|
xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename); |
|
} |
|
|
return SUCCESS; |
return SUCCESS; |
} |
} |
|
|
|
|
static PHP_RINIT_FUNCTION(libxml) |
static PHP_RINIT_FUNCTION(libxml) |
{ |
{ |
/* report errors via handler rather than stderr */ | if (_php_libxml_per_request_initialization) { |
xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); | /* report errors via handler rather than stderr */ |
xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename); | xmlSetGenericErrorFunc(NULL, php_libxml_error_handler); |
xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename); | xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename); |
| xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename); |
| } |
return SUCCESS; |
return SUCCESS; |
} |
} |
|
|
|
|
static PHP_MSHUTDOWN_FUNCTION(libxml) |
static PHP_MSHUTDOWN_FUNCTION(libxml) |
{ |
{ |
|
if (!_php_libxml_per_request_initialization) { |
|
xmlSetGenericErrorFunc(NULL, NULL); |
|
xmlSetStructuredErrorFunc(NULL, NULL); |
|
|
|
xmlParserInputBufferCreateFilenameDefault(NULL); |
|
xmlOutputBufferCreateFilenameDefault(NULL); |
|
} |
php_libxml_shutdown(); |
php_libxml_shutdown(); |
|
|
return SUCCESS; |
return SUCCESS; |
} |
} |
|
|
| static int php_libxml_post_deactivate() |
static PHP_RSHUTDOWN_FUNCTION(libxml) | |
{ |
{ |
|
TSRMLS_FETCH(); |
/* reset libxml generic error handling */ |
/* reset libxml generic error handling */ |
xmlSetGenericErrorFunc(NULL, NULL); | if (_php_libxml_per_request_initialization) { |
xmlSetStructuredErrorFunc(NULL, NULL); | xmlSetGenericErrorFunc(NULL, NULL); |
| xmlSetStructuredErrorFunc(NULL, NULL); |
|
|
xmlParserInputBufferCreateFilenameDefault(NULL); | xmlParserInputBufferCreateFilenameDefault(NULL); |
xmlOutputBufferCreateFilenameDefault(NULL); | xmlOutputBufferCreateFilenameDefault(NULL); |
| } |
|
|
if (LIBXML(stream_context)) { |
if (LIBXML(stream_context)) { |
zval_ptr_dtor(&LIBXML(stream_context)); |
zval_ptr_dtor(&LIBXML(stream_context)); |
Line 676 static PHP_RSHUTDOWN_FUNCTION(libxml)
|
Line 884 static PHP_RSHUTDOWN_FUNCTION(libxml)
|
LIBXML(error_list) = NULL; |
LIBXML(error_list) = NULL; |
} |
} |
xmlResetLastError(); |
xmlResetLastError(); |
|
|
|
_php_libxml_destroy_fci(&LIBXML(entity_loader).fci); |
|
|
return SUCCESS; |
return SUCCESS; |
} |
} |
Line 855 static PHP_FUNCTION(libxml_disable_entity_loader)
|
Line 1065 static PHP_FUNCTION(libxml_disable_entity_loader)
|
} |
} |
|
|
RETURN_FALSE; |
RETURN_FALSE; |
|
} |
|
/* }}} */ |
|
|
|
/* {{{ proto void libxml_set_external_entity_loader(callback resolver_function) |
|
Changes the default external entity loader */ |
|
static PHP_FUNCTION(libxml_set_external_entity_loader) |
|
{ |
|
zend_fcall_info fci; |
|
zend_fcall_info_cache fcc; |
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f!", &fci, &fcc) |
|
== FAILURE) { |
|
return; |
|
} |
|
|
|
_php_libxml_destroy_fci(&LIBXML(entity_loader).fci); |
|
|
|
if (fci.size > 0) { /* argument not null */ |
|
LIBXML(entity_loader).fci = fci; |
|
Z_ADDREF_P(fci.function_name); |
|
if (fci.object_ptr != NULL) { |
|
Z_ADDREF_P(fci.object_ptr); |
|
} |
|
LIBXML(entity_loader).fcc = fcc; |
|
} |
|
|
|
RETURN_TRUE; |
} |
} |
/* }}} */ |
/* }}} */ |
|
|