PHP_FUNCTION(sample_fopen)
{
php_sample_descriptor_data *fdata;
FILE *fp;
char *filename, *mode, *hash_key;
int filename_len, mode_len, hash_key_len;
zend_bool persist = 0;
list_entry *existing_file;
if
(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
"ssb"
,
&filename, &filename_len, &mode, &mode_len,
&persist) == FAILURE) {
RETURN_NULL();
}
if
(!filename_len !mode_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Invalid filename or mode length"
);
RETURN_FALSE;
}
<strong>
hash_key_len = spprintf(&hash_key, 0,
"sample_descriptor:%s:%s"
, filename, mode);
if
(zend_hash_find(&EG(persistent_list), hash_key,
hash_key_len + 1, (void **)&existing_file) == SUCCESS) {
ZEND_REGISTER_RESOURCE(return_value,
existing_file->ptr, le_sample_descriptor_persist);
efree(hash_key);
return
;
}</strong>
fp =
fopen
(filename, mode);
if
(!fp) {
php_error_docref(NULL TSRMLS_CC, E_WARNING,
"Unable to open %s using mode %s"
,
filename, mode);
RETURN_FALSE;
}
if
(!persist) {
fdata = emalloc(sizeof(php_sample_descriptor_data));
fdata->filename = estrndup(filename, filename_len);
fdata->fp = fp;
ZEND_REGISTER_RESOURCE(return_value, fdata,
le_sample_descriptor);
}
else
{
list_entry le;
fdata =pemalloc(sizeof(php_sample_descriptor_data),1);
fdata->filename = pemalloc(filename_len + 1, 1);
memcpy(data->filename, filename, filename_len + 1);
fdata->fp = fp;
ZEND_REGISTER_RESOURCE(return_value, fdata,
le_sample_descriptor_persist);
le.type = le_sample_descriptor_persist;
le.ptr = fdata;
zend_hash_update(&EG(persistent_list),
hash_key, hash_key_len + 1,
(void*)&le, sizeof(list_entry), NULL);
}
efree(hash_key);
}