cvs: /php4/ext/standard fsock.c
| From: | Evan Klinger | Date: | Mon, 20 Dec 1999 00:56:29 +0000 |
| Subject: | cvs: /php4/ext/standard fsock.c | ||
| Groups: | php.version4 | ||
| Request: | Send a blank email to php-version4+get-8192@lists.php.net to get a copy of this message | ||
evan Sun Dec 19 19:56:29 1999 EDT
Modified files:
/php4/ext/standard fsock.c
Log:
Ex API and UDP support.
@- Added UDP support in fsockopen() (Evan).
# UDP activated with "udp://hostname"
Index: php4/ext/standard/fsock.c
diff -u php4/ext/standard/fsock.c:1.34 php4/ext/standard/fsock.c:1.35
--- php4/ext/standard/fsock.c:1.34 Fri Dec 17 23:01:14 1999
+++ php4/ext/standard/fsock.c Sun Dec 19 19:55:58 1999
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: fsock.c,v 1.34 1999/12/18 04:01:14 zeev Exp $ */
+/* $Id: fsock.c,v 1.35 1999/12/20 00:55:58 evan Exp $ */
/* Synced with php 3.0 revision 1.121 1999-06-18 [ssb] */
/* Synced with php 3.0 revision 1.133 1999-07-21 [sas] */
@@ -236,25 +236,26 @@
to this variable.
*/
static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
- pval *args[5];
+ pval **args[5];
int *sock=emalloc(sizeof(int));
int *sockp;
int arg_count=ARG_COUNT(ht);
int socketd = -1;
+ unsigned char udp = 0;
struct timeval timeout = { 60, 0 };
unsigned short portno;
unsigned long conv;
char *key = NULL;
FLS_FETCH();
- if (arg_count > 5 || arg_count < 2 || getParametersArray(ht,arg_count,args)==FAILURE) {
+ if (arg_count > 5 || arg_count < 2 || zend_get_parameters_array_ex(arg_count,args)==FAILURE)
{
FREE_SOCK;
WRONG_PARAM_COUNT;
}
switch(arg_count) {
case 5:
- convert_to_double(args[4]);
- conv = (unsigned long) (args[4]->value.dval * 1000000.0);
+ convert_to_double_ex(args[4]);
+ conv = (unsigned long) ((*args[4])->value.dval * 1000000.0);
timeout.tv_sec = conv / 1000000;
timeout.tv_usec = conv % 1000000;
/* fall-through */
@@ -262,25 +263,25 @@
if(!ParameterPassedByReference(ht,4)) {
php_error(E_WARNING,"error string argument to fsockopen not passed by reference");
}
- pval_copy_constructor(args[3]);
- args[3]->value.str.val = empty_string;
- args[3]->value.str.len = 0;
- args[3]->type = IS_STRING;
+ pval_copy_constructor(*args[3]);
+ (*args[3])->value.str.val = empty_string;
+ (*args[3])->value.str.len = 0;
+ (*args[3])->type = IS_STRING;
/* fall-through */
case 3:
if(!ParameterPassedByReference(ht,3)) {
php_error(E_WARNING,"error argument to fsockopen not passed by reference");
}
- args[2]->type = IS_LONG;
- args[2]->value.lval = 0;
+ (*args[2])->type = IS_LONG;
+ (*args[2])->value.lval = 0;
break;
}
- convert_to_string(args[0]);
- convert_to_long(args[1]);
- portno = (unsigned short) args[1]->value.lval;
+ convert_to_string_ex(args[0]);
+ convert_to_long_ex(args[1]);
+ portno = (unsigned short) (*args[1])->value.lval;
- key = emalloc(args[0]->value.str.len + 10);
- sprintf(key, "%s:%d", args[0]->value.str.val, portno);
+ key = emalloc((*args[0])->value.str.len + 10);
+ sprintf(key, "%s:%d", (*args[0])->value.str.val, portno);
if (persistent && zend_hash_find(&FG(ht_fsock_keys), key, strlen(key) + 1,
(void *) &sockp) == SUCCESS) {
@@ -294,7 +295,17 @@
struct sockaddr_in server;
memset(&server, 0, sizeof(server));
- socketd = socket(AF_INET, SOCK_STREAM, 0);
+ if((*args[0])->value.str.val[0] == 'u' &&
+ (*args[0])->value.str.val[1] == 'd' &&
+ (*args[0])->value.str.val[2] == 'p' &&
+ (*args[0])->value.str.val[3] == ':' &&
+ (*args[0])->value.str.val[4] == '/' &&
+ (*args[0])->value.str.val[5] == '/') {
+ udp = 1;
+ }
+
+ socketd = socket(AF_INET,udp ? SOCK_DGRAM : SOCK_STREAM,0);
+
if (socketd == SOCK_ERR) {
FREE_SOCK;
RETURN_FALSE;
@@ -302,7 +313,7 @@
server.sin_family = AF_INET;
- if (lookup_hostname(args[0]->value.str.val, &server.sin_addr)) {
+ if(lookup_hostname(udp ? &(*args[0])->value.str.val[6] :
(*args[0])->value.str.val,&server.sin_addr)) {
FREE_SOCK;
RETURN_FALSE;
}
@@ -311,10 +322,10 @@
if (connect_nonb(socketd, (struct sockaddr *)&server, sizeof(server), &timeout) ==
SOCK_CONN_ERR) {
FREE_SOCK;
- if(arg_count>2) args[2]->value.lval = errno;
+ if(arg_count>2) (*args[2])->value.lval = errno;
if(arg_count>3) {
- args[3]->value.str.val = estrdup(strerror(errno));
- args[3]->value.str.len = strlen(args[3]->value.str.val);
+ (*args[3])->value.str.val = estrdup(strerror(errno));
+ (*args[3])->value.str.len = strlen((*args[3])->value.str.val);
}
RETURN_FALSE;
}
@@ -330,14 +341,14 @@
memset(&unix_addr,(char)0,sizeof(unix_addr));
unix_addr.sun_family = AF_UNIX;
- strcpy(unix_addr.sun_path, args[0]->value.str.val);
+ strcpy(unix_addr.sun_path, (*args[0])->value.str.val);
if (connect_nonb(socketd, (struct sockaddr *) &unix_addr, sizeof(unix_addr), &timeout) ==
SOCK_CONN_ERR) {
FREE_SOCK;
- if(arg_count>2) args[2]->value.lval = errno;
+ if(arg_count>2) (*args[2])->value.lval = errno;
if(arg_count>3) {
- args[3]->value.str.val = estrdup(strerror(errno));
- args[3]->value.str.len = strlen(args[3]->value.str.val);
+ (*args[3])->value.str.val = estrdup(strerror(errno));
+ (*args[3])->value.str.len = strlen((*args[3])->value.str.val);
}
RETURN_FALSE;
}