summaryrefslogtreecommitdiff
path: root/ext/hyperwave
diff options
context:
space:
mode:
authorUwe Steinmann <steinm@php.net>1999-08-06 10:42:00 +0000
committerUwe Steinmann <steinm@php.net>1999-08-06 10:42:00 +0000
commit7ef3076a56015fd62e0fa320c53928d66c25fc64 (patch)
treef7f5bdcd28b019d02c81cf597393e74b7a352fd6 /ext/hyperwave
parent4b8a100ec97dde79c5dc9e3ba0b50c3ce8939e85 (diff)
downloadphp-git-7ef3076a56015fd62e0fa320c53928d66c25fc64.tar.gz
Made Hypwerwave module threat safe
Diffstat (limited to 'ext/hyperwave')
-rw-r--r--ext/hyperwave/hg_comm.h2
-rw-r--r--ext/hyperwave/hw.c291
-rw-r--r--ext/hyperwave/php3_hyperwave.h52
3 files changed, 206 insertions, 139 deletions
diff --git a/ext/hyperwave/hg_comm.h b/ext/hyperwave/hg_comm.h
index 12503e8181..047bb855a1 100644
--- a/ext/hyperwave/hg_comm.h
+++ b/ext/hyperwave/hg_comm.h
@@ -36,7 +36,7 @@
#define F_DISTRIBUTED 0x80000000
#define F_COMPRESSED 0x40000000
#define F_VERSION 0x00003fff
-#define HW_VERSION 717L /* 7.17 */
+#define HW_VERSION 717L /* 7.17 */
#define HEADER_LENGTH 12
diff --git a/ext/hyperwave/hw.c b/ext/hyperwave/hw.c
index f1e807661c..d92b2e33f6 100644
--- a/ext/hyperwave/hw.c
+++ b/ext/hyperwave/hw.c
@@ -38,15 +38,10 @@
#if HYPERWAVE
+#include "php_ini.h"
#include "php3_hyperwave.h"
-#if APACHE
-# ifndef DEBUG
-# undef palloc
-# endif
-#endif
-
-hw_module php3_hw_module;
+//hw_module php3_hw_module;
function_entry hw_functions[] = {
PHP_FE(hw_connect, NULL)
@@ -115,9 +110,19 @@ function_entry hw_functions[] = {
};
php3_module_entry hw_module_entry = {
- "HyperWave", hw_functions, PHP_MINIT(hw), NULL, NULL, NULL, PHP_MINFO(hw), 0, 0, 0, NULL
+ "HyperWave", hw_functions, PHP_MINIT(hw), PHP_MSHUTDOWN(hw), NULL, NULL, PHP_MINFO(hw), 0, 0, 0, NULL
};
+#ifdef ZTS
+int hw_globals_id;
+#else
+PHP_HW_API php_hw_globals hw_globals;
+#endif
+
+#ifdef COMPILE_DL
+DLEXPORT php3_module_entry *get_module(void) { return &hw_module_entry; }
+#endif
+
void print_msg(hg_msg *msg, char *str, int txt);
#if COMPILE_DL
@@ -132,7 +137,7 @@ void _close_hw_link(hw_connection *conn)
free(conn->username);
close(conn->socket);
free(conn);
- php3_hw_module.num_links--;
+ HwSG(num_links)--;
}
void _close_hw_plink(hw_connection *conn)
@@ -143,8 +148,8 @@ void _close_hw_plink(hw_connection *conn)
free(conn->username);
close(conn->socket);
free(conn);
- php3_hw_module.num_links--;
- php3_hw_module.num_persistent--;
+ HwSG(num_links)--;
+ HwSG(num_persistent)--;
}
void _free_hw_document(hw_document *doc)
@@ -158,13 +163,58 @@ void _free_hw_document(hw_document *doc)
free(doc);
}
+#ifdef ZTS
+static void php_hw_init_globals(php_hw_globals *hw_globals)
+{
+ HwSG(num_persistent) = 0;
+}
+#endif
+
+static PHP_INI_MH(OnHyperwavePort) {
+ HwSLS_FETCH();
+
+ if (new_value==NULL) {
+ HwSG(default_port) = HG_SERVER_PORT;
+ } else {
+ HwSG(default_port) = atoi(new_value);
+ }
+ return SUCCESS;
+}
+
+PHP_INI_BEGIN()
+ STD_PHP_INI_ENTRY("hyerwave.allow_persistent", "0", PHP_INI_SYSTEM, OnUpdateInt, allow_persistent, php_hw_globals, hw_globals)
+ PHP_INI_ENTRY("hyperwave.default_port", "418", PHP_INI_ALL, OnHyperwavePort)
+PHP_INI_END()
+
+PHP_MINIT_FUNCTION(hw) {
+
+#ifdef ZTS
+ hw_globals_id = ts_allocate_id(sizeof(php_hw_globals), php_hw_init_globals, NULL);
+#else
+ HwSG(num_persistent)=0;
+#endif
+ REGISTER_INI_ENTRIES();
+ HwSG(le_socketp) = register_list_destructors(_close_hw_link,NULL);
+ HwSG(le_psocketp) = register_list_destructors(NULL,_close_hw_plink);
+ HwSG(le_document) = register_list_destructors(_free_hw_document,NULL);
+ hw_module_entry.type = type;
+
+ return SUCCESS;
+}
+
+PHP_MSHUTDOWN_FUNCTION(hw)
+{
+ UNREGISTER_INI_ENTRIES();
+ return SUCCESS;
+}
+
/* creates an array in return value and frees all memory
* Also adds as an assoc. array at the end of the return array with
* statistics.
*/
int make_return_objrec(pval **return_value, char **objrecs, int count)
{
- pval stat_arr;
+ zval *stat_arr;
int i;
int hidden, collhead, fullcollhead, total;
int collheadnr, fullcollheadnr;
@@ -201,19 +251,20 @@ int make_return_objrec(pval **return_value, char **objrecs, int count)
efree(objrecs);
/* Array for statistics */
- if (array_init(&stat_arr) == FAILURE) {
+ stat_arr = (zval *) emalloc(sizeof(zval));
+ if (array_init(stat_arr) == FAILURE) {
return -1;
}
- add_assoc_long(&stat_arr, "Hidden", hidden);
- add_assoc_long(&stat_arr, "CollectionHead", collhead);
- add_assoc_long(&stat_arr, "FullCollectionHead", fullcollhead);
- add_assoc_long(&stat_arr, "Total", total);
- add_assoc_long(&stat_arr, "CollectionHeadNr", collheadnr);
- add_assoc_long(&stat_arr, "FullCollectionHeadNr", fullcollheadnr);
+ add_assoc_long(stat_arr, "Hidden", hidden);
+ add_assoc_long(stat_arr, "CollectionHead", collhead);
+ add_assoc_long(stat_arr, "FullCollectionHead", fullcollhead);
+ add_assoc_long(stat_arr, "Total", total);
+ add_assoc_long(stat_arr, "CollectionHeadNr", collheadnr);
+ add_assoc_long(stat_arr, "FullCollectionHeadNr", fullcollheadnr);
/* Add the stat array */
- zend_hash_next_index_insert((*return_value)->value.ht, &stat_arr, sizeof(pval), NULL);
+ zend_hash_next_index_insert((*return_value)->value.ht, &stat_arr, sizeof(zval), NULL);
/* The title array can now be freed, but I don't know how */
return 0;
@@ -297,21 +348,18 @@ int make_return_array_from_objrec(pval **return_value, char *objrec) {
if(hasTitle) {
zend_hash_update((*return_value)->value.ht, "Title", 6, &title_arr, sizeof(zval *), NULL);
- /* The title array can now be freed, but I don't know how */
}
if(hasDescription) {
/* Add the description array, if we have one */
zend_hash_update((*return_value)->value.ht, "Description", 12, &desc_arr, sizeof(zval *), NULL);
- /* The description array can now be freed, but I don't know how */
}
if(hasKeyword) {
/* Add the keyword array, if we have one */
zend_hash_update((*return_value)->value.ht, "Keyword", 8, &keyword_arr, sizeof(zval *), NULL);
- /* The keyword array can now be freed, but I don't know how */
}
/* All other attributes. Make a another copy first */
@@ -434,25 +482,6 @@ static int * make_ints_from_array(HashTable *lht) {
return objrec;
}
-PHP_MINIT_FUNCTION(hw) {
-
- if (cfg_get_long("hw.allow_persistent",&php3_hw_module.allow_persistent)==FAILURE) {
- php3_hw_module.allow_persistent=1;
- }
- if (cfg_get_long("hw.max_persistent",&php3_hw_module.max_persistent)==FAILURE) {
- php3_hw_module.max_persistent=-1;
- }
- if (cfg_get_long("hw.max_links",&php3_hw_module.max_links)==FAILURE) {
- php3_hw_module.max_links=-1;
- }
- php3_hw_module.num_persistent=0;
- php3_hw_module.le_socketp = register_list_destructors(_close_hw_link,NULL);
- php3_hw_module.le_psocketp = register_list_destructors(NULL,_close_hw_plink);
- php3_hw_module.le_document = register_list_destructors(_free_hw_document,NULL);
-
- return SUCCESS;
-}
-
#define BUFFERLEN 30
static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
@@ -522,16 +551,16 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (zend_hash_find(plist, hashed_details, hashed_details_length+1, (void **) &le)==FAILURE) {
list_entry new_le;
- if (php3_hw_module.max_links!=-1 && php3_hw_module.num_links>=php3_hw_module.max_links) {
- php_error(E_ERROR,"Hyperwave: Too many open links (%d)",php3_hw_module.num_links);
+ if (HwSG(max_links)!=-1 && HwSG(num_links)>=HwSG(max_links)) {
+ php_error(E_ERROR,"Hyperwave: Too many open links (%d)",HwSG(num_links));
if(host) efree(host);
if(username) efree(username);
if(password) efree(password);
efree(hashed_details);
RETURN_FALSE;
}
- if (php3_hw_module.max_persistent!=-1 && php3_hw_module.num_persistent>=php3_hw_module.max_persistent) {
- php_error(E_ERROR,"Hyperwave: Too many open persistent links (%d)",php3_hw_module.num_persistent);
+ if (HwSG(max_persistent!=-1) && HwSG(num_persistent)>=HwSG(max_persistent)) {
+ php_error(E_ERROR,"Hyperwave: Too many open persistent links (%d)",HwSG(num_persistent));
if(host) efree(host);
if(username) efree(username);
if(password) efree(password);
@@ -580,7 +609,7 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
ptr->username = strdup("anonymous");
new_le.ptr = (void *) ptr;
- new_le.type = php3_hw_module.le_psocketp;;
+ new_le.type = HwSG(le_psocketp);
if (zend_hash_update(plist,hashed_details,hashed_details_length+1,(void *) &new_le, sizeof(list_entry), NULL)==FAILURE) {
php_error(E_ERROR, "Could not hash table with connection details");
@@ -592,17 +621,17 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
RETURN_FALSE;
}
- php3_hw_module.num_links++;
- php3_hw_module.num_persistent++;
+ HwSG(num_links)++;
+ HwSG(num_persistent)++;
} else {
/*php_printf("Found already open connection\n"); */
- if (le->type != php3_hw_module.le_psocketp) {
+ if (le->type != HwSG(le_psocketp)) {
RETURN_FALSE;
}
ptr = le->ptr;
}
- return_value->value.lval = php3_list_insert(ptr,php3_hw_module.le_psocketp);
+ return_value->value.lval = php3_list_insert(ptr,HwSG(le_psocketp));
return_value->type = IS_LONG;
} else {
@@ -622,8 +651,8 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
}
link = (int) index_ptr->ptr;
ptr = (hw_connection *) php3_list_find(link,&type); /* check if the link is still there */
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
- return_value->value.lval = php3_hw_module.default_link = link;
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
+ return_value->value.lval = HwSG(default_link) = link;
return_value->type = IS_LONG;
efree(hashed_details);
if(username) efree(username);
@@ -674,7 +703,7 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
ptr->hostname = strdup(host);
ptr->username = strdup("anonymous");
- return_value->value.lval = php3_list_insert(ptr,php3_hw_module.le_socketp);
+ return_value->value.lval = php3_list_insert(ptr,HwSG(le_socketp));
return_value->type = IS_LONG;
new_index_ptr.ptr = (void *) return_value->value.lval;
@@ -690,7 +719,7 @@ static void php3_hw_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
efree(hashed_details);
if(host) efree(host);
- php3_hw_module.default_link=return_value->value.lval;
+ HwSG(default_link)=return_value->value.lval;
/* At this point we have a working connection. If userdata was given
we are also indentified.
@@ -743,7 +772,7 @@ PHP_FUNCTION(hw_close) {
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -767,7 +796,7 @@ PHP_FUNCTION(hw_info)
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -799,7 +828,7 @@ PHP_FUNCTION(hw_error)
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -822,7 +851,7 @@ PHP_FUNCTION(hw_errormsg)
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -927,7 +956,7 @@ char *php3_hw_command(INTERNAL_FUNCTION_PARAMETERS, int comm) {
convert_to_long(arg1);
link=arg1->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
return NULL;
}
@@ -960,7 +989,7 @@ PHP_FUNCTION(hw_stat) {
/* {{{ proto array hw_who(int link)
Returns names and info of users loged in */
PHP_FUNCTION(hw_who) {
- pval user_arr;
+ zval *user_arr;
char *object, *ptr, *temp, *attrname;
int i;
@@ -995,30 +1024,31 @@ php_printf("%s\n", ptr);
while(attrname != NULL) {
char *name;
- if (array_init(&user_arr) == FAILURE) {
+ user_arr = (zval *) emalloc(sizeof(zval));
+ if (array_init(user_arr) == FAILURE) {
efree(object);
RETURN_FALSE;
}
ptr = attrname;
if(*ptr++ == '*')
- add_assoc_long(&user_arr, "self", 1);
+ add_assoc_long(user_arr, "self", 1);
else
- add_assoc_long(&user_arr, "self", 0);
+ add_assoc_long(user_arr, "self", 0);
ptr++;
name = ptr;
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "id", name, 1);
+ add_assoc_string(user_arr, "id", name, 1);
ptr++;
name = ptr;
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "name", name, 1);
+ add_assoc_string(user_arr, "name", name, 1);
ptr++;
while((*ptr != '\0') && (*ptr == ' '))
@@ -1028,7 +1058,7 @@ php_printf("%s\n", ptr);
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "system", name, 1);
+ add_assoc_string(user_arr, "system", name, 1);
ptr++;
while((*ptr != '\0') && (*ptr == ' '))
@@ -1038,7 +1068,7 @@ php_printf("%s\n", ptr);
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "onSinceDate", name, 1);
+ add_assoc_string(user_arr, "onSinceDate", name, 1);
ptr++;
while((*ptr != '\0') && (*ptr == ' '))
@@ -1048,7 +1078,7 @@ php_printf("%s\n", ptr);
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "onSinceTime", name, 1);
+ add_assoc_string(user_arr, "onSinceTime", name, 1);
ptr++;
while((*ptr != '\0') && (*ptr == ' '))
@@ -1058,13 +1088,11 @@ php_printf("%s\n", ptr);
while((*ptr != '\0') && (*ptr != ' '))
ptr++;
*ptr = '\0';
- add_assoc_string(&user_arr, "TotalTime", name, 1);
+ add_assoc_string(user_arr, "TotalTime", name, 1);
/* Add the user array */
zend_hash_index_update(return_value->value.ht, i++, &user_arr, sizeof(pval), NULL);
- /* The user array can now be freed, but I don't know how */
-
attrname = strtok(NULL, "\n");
}
efree(temp);
@@ -1090,7 +1118,7 @@ PHP_FUNCTION(hw_dummy) {
id=arg2->value.lval;
msgid=arg3->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1137,7 +1165,7 @@ PHP_FUNCTION(hw_getobject) {
link=argv[0]->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1211,7 +1239,7 @@ PHP_FUNCTION(hw_insertobject) {
objrec=arg2->value.str.val;
parms=arg3->value.str.val;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -1242,7 +1270,7 @@ PHP_FUNCTION(hw_getandlock) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1273,7 +1301,7 @@ PHP_FUNCTION(hw_unlock) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1301,7 +1329,7 @@ PHP_FUNCTION(hw_deleteobject) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1334,7 +1362,7 @@ PHP_FUNCTION(hw_changeobject) {
id=arg2->value.lval;
newobjarr=arg3->value.ht;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1436,7 +1464,7 @@ PHP_FUNCTION(hw_modifyobject) {
remobjarr=argv[2]->value.ht;
addobjarr=argv[3]->value.ht;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1666,7 +1694,7 @@ fprintf(stderr, "Copy/Move %d\n", mvcp);
break;
}
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -1779,7 +1807,7 @@ PHP_FUNCTION(hw_gettext) {
link=argv[0]->value.lval;
id=argv[1]->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1798,7 +1826,7 @@ PHP_FUNCTION(hw_gettext) {
doc->attributes = attributes;
doc->bodytag = bodytag;
doc->size = count;
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
}
@@ -1820,7 +1848,7 @@ PHP_FUNCTION(hw_edittext) {
link=arg1->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find socket identifier %d",link);
RETURN_FALSE;
}
@@ -1828,7 +1856,7 @@ PHP_FUNCTION(hw_edittext) {
doc=arg2->value.lval;
docptr = php3_list_find(doc,&type);
- if(!docptr || (type!=php3_hw_module.le_document)) {
+ if(!docptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find document identifier %d", doc);
RETURN_FALSE;
}
@@ -1862,7 +1890,7 @@ PHP_FUNCTION(hw_getcgi) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1900,7 +1928,7 @@ PHP_FUNCTION(hw_getcgi) {
doc->attributes = attributes;
doc->bodytag = NULL;
doc->size = count;
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
}
@@ -1923,7 +1951,7 @@ PHP_FUNCTION(hw_getremote) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -1941,7 +1969,7 @@ PHP_FUNCTION(hw_getremote) {
doc->attributes = attributes;
doc->bodytag = NULL;
doc->size = count;
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
}
@@ -1963,7 +1991,7 @@ PHP_FUNCTION(hw_getremotechildren) {
link=arg1->value.lval;
objrec=arg2->value.str.val;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d", link);
RETURN_FALSE;
}
@@ -2029,7 +2057,7 @@ php_printf("count = %d, remainder = <HR>%s---<HR>", count, remainder);
doc->attributes = strdup(objrec);
doc->bodytag = NULL;
doc->size = strlen(doc->data);
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
} else {
if (array_init(return_value) == FAILURE) {
@@ -2066,7 +2094,7 @@ PHP_FUNCTION(hw_setlinkroot) {
link = arg1->value.lval;
rootid = arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -2106,7 +2134,7 @@ PHP_FUNCTION(hw_pipedocument) {
*/ link=argv[0]->value.lval;
id=argv[1]->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d", link);
RETURN_FALSE;
}
@@ -2138,7 +2166,7 @@ PHP_FUNCTION(hw_pipedocument) {
doc->bodytag = bodytag;
doc->size = count;
/* fprintf(stderr, "size = %d\n", count); */
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
}
@@ -2166,7 +2194,7 @@ PHP_FUNCTION(hw_pipecgi) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2203,7 +2231,7 @@ PHP_FUNCTION(hw_pipecgi) {
doc->attributes = attributes;
doc->bodytag = NULL;
doc->size = count;
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
}
@@ -2231,14 +2259,14 @@ PHP_FUNCTION(hw_insertdocument) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find connection identifier %d",link);
RETURN_FALSE;
}
doc=arg3->value.lval;
docptr = php3_list_find(doc,&type);
- if(!docptr || (type!=php3_hw_module.le_document)) {
+ if(!docptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find document identifier %d",doc);
RETURN_FALSE;
}
@@ -2288,7 +2316,7 @@ PHP_FUNCTION(hw_new_document) {
doc->attributes = strdup(arg1->value.str.val);
doc->bodytag = NULL;
doc->size = arg3->value.lval;
- return_value->value.lval = php3_list_insert(doc,php3_hw_module.le_document);
+ return_value->value.lval = php3_list_insert(doc,HwSG(le_document));
return_value->type = IS_LONG;
}
/* }}} */
@@ -2306,7 +2334,7 @@ PHP_FUNCTION(hw_free_document) {
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2332,7 +2360,7 @@ PHP_FUNCTION(hw_output_document) {
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2366,7 +2394,7 @@ PHP_FUNCTION(hw_document_bodytag) {
convert_to_long(argv[0]);
id=argv[0]->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2405,7 +2433,7 @@ PHP_FUNCTION(hw_document_content) {
convert_to_long(argv[0]);
id=argv[0]->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2433,7 +2461,7 @@ PHP_FUNCTION(hw_document_setcontent) {
convert_to_string(argv[1]);
id=argv[0]->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2467,7 +2495,7 @@ PHP_FUNCTION(hw_document_size) {
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2493,7 +2521,7 @@ PHP_FUNCTION(hw_document_attributes) {
convert_to_long(arg1);
id=arg1->value.lval;
ptr = php3_list_find(id,&type);
- if(!ptr || (type!=php3_hw_module.le_document)) {
+ if(!ptr || (type!=HwSG(le_document))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2520,7 +2548,7 @@ PHP_FUNCTION(hw_getparentsobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2554,7 +2582,7 @@ PHP_FUNCTION(hw_getparents) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2599,7 +2627,7 @@ PHP_FUNCTION(hw_children) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2645,7 +2673,7 @@ PHP_FUNCTION(hw_childrenobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2679,7 +2707,7 @@ PHP_FUNCTION(hw_getchildcoll) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2725,7 +2753,7 @@ PHP_FUNCTION(hw_getchildcollobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2758,7 +2786,7 @@ PHP_FUNCTION(hw_docbyanchor) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2789,7 +2817,7 @@ PHP_FUNCTION(hw_docbyanchorobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2830,7 +2858,7 @@ PHP_FUNCTION(hw_getobjectbyquery) {
maxhits=arg3->value.lval;
if (maxhits < 0) maxhits=0x7FFFFFFF;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -2873,7 +2901,7 @@ PHP_FUNCTION(hw_getobjectbyqueryobj) {
maxhits=arg3->value.lval;
if (maxhits < 0) maxhits=0x7FFFFFFF;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -2913,7 +2941,7 @@ PHP_FUNCTION(hw_getobjectbyquerycoll) {
maxhits=arg4->value.lval;
if (maxhits < 0) maxhits=0x7FFFFFFF;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2958,7 +2986,7 @@ PHP_FUNCTION(hw_getobjectbyquerycollobj) {
maxhits=arg4->value.lval;
if (maxhits < 0) maxhits=0x7FFFFFFF;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -2992,7 +3020,7 @@ PHP_FUNCTION(hw_getchilddoccoll) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -3031,7 +3059,7 @@ PHP_FUNCTION(hw_getchilddoccollobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -3066,7 +3094,7 @@ PHP_FUNCTION(hw_getanchors) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -3105,7 +3133,7 @@ PHP_FUNCTION(hw_getanchorsobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = (hw_connection *) php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",id);
RETURN_FALSE;
}
@@ -3135,7 +3163,7 @@ PHP_FUNCTION(hw_getusername) {
convert_to_long(arg1);
link = arg1->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3164,7 +3192,7 @@ PHP_FUNCTION(hw_identify) {
name=arg2->value.str.val;
passwd=arg3->value.str.val;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3246,7 +3274,7 @@ PHP_FUNCTION(hw_incollections) {
link = arg1->value.lval;
retcoll=arg4->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3306,7 +3334,7 @@ PHP_FUNCTION(hw_inscoll) {
link = arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3354,7 +3382,7 @@ PHP_FUNCTION(hw_insdoc) {
link = argv[0]->value.lval;
id = argv[1]->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3386,7 +3414,7 @@ PHP_FUNCTION(hw_getsrcbydestobj) {
link=arg1->value.lval;
id=arg2->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3424,7 +3452,7 @@ PHP_FUNCTION(hw_getrellink) {
sourceid=arg3->value.lval;
destid=arg4->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
@@ -3442,7 +3470,8 @@ PHP_FUNCTION(hw_getrellink) {
PHP_MINFO_FUNCTION(hw)
{
- php_printf("HG-CSP Version: 7.17");
+ php_printf("HG-CSP Version: 7.17<BR>\n");
+ DISPLAY_INI_ENTRIES();
}
/* {{{ proto void hw_connection_info(int link)
@@ -3459,7 +3488,7 @@ PHP_FUNCTION(hw_connection_info)
convert_to_long(arg1);
link=arg1->value.lval;
ptr = php3_list_find(link,&type);
- if(!ptr || (type!=php3_hw_module.le_socketp && type!=php3_hw_module.le_psocketp)) {
+ if(!ptr || (type!=HwSG(le_socketp) && type!=HwSG(le_psocketp))) {
php_error(E_WARNING,"Unable to find file identifier %d",link);
RETURN_FALSE;
}
diff --git a/ext/hyperwave/php3_hyperwave.h b/ext/hyperwave/php3_hyperwave.h
index 087a329c3c..f911c56fbb 100644
--- a/ext/hyperwave/php3_hyperwave.h
+++ b/ext/hyperwave/php3_hyperwave.h
@@ -28,21 +28,58 @@
#ifndef _HW_H
#define _HW_H
+#if COMPILE_DL
+#undef HYPERWAVE
+#define HYPERWAVE 1
+#endif
+
+#if WIN32||WINNT
+#define PHP_HW_API __declspec(dllexport)
+#else
+#define PHP_HW_API
+#endif
+
#if HYPERWAVE
+#ifndef DLEXPORT
+#define DLEXPORT
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
#include "hg_comm.h"
extern php3_module_entry hw_module_entry;
#define hw_module_ptr &hw_module_entry
typedef struct {
- long default_link;
- long num_links,num_persistent;
- long max_links,max_persistent;
- long allow_persistent;
- int le_socketp, le_psocketp, le_document;
-} hw_module;
+ long default_link;
+ long default_port;
+ long num_links,num_persistent;
+ long max_links,max_persistent;
+ long allow_persistent;
+ int le_socketp, le_psocketp, le_document;
+} php_hw_globals;
+
+#ifdef ZTS
+# define HwSLS_D php_hw_globals *hw_globals
+# define HwSLS_DC , HwSLS_D
+# define HwSLS_C hw_globals
+# define HwSLS_CC , HwSLS_C
+# define HwSG(v) (hw_globals->v)
+# define HwSLS_FETCH() php_hw_globals *hw_globals = ts_resource(hw_globals_id)
+#else
+# define HwSLS_D
+# define HwSLS_DC
+# define HwSLS_C
+# define HwSLS_CC
+# define HwSG(v) (hw_globals.v)
+# define HwSLS_FETCH()
+extern PHP_HW_API php_hw_globals hw_globals;
+#endif
-extern hw_module php3_hw_module;
+//extern hw_module php3_hw_module;
typedef struct {
int size;
@@ -54,6 +91,7 @@ typedef struct {
extern hw_connection php3_hw_connection;
extern PHP_MINIT_FUNCTION(hw);
+extern PHP_MSHUTDOWN_FUNCTION(hw);
PHP_MINFO_FUNCTION(hw);
PHP_FUNCTION(hw_connect);