cvs: /php4/ext/standard fsock.c

From: 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; }

« previous php.version4 (#8192) next »