]> granicus.if.org Git - php/commitdiff
Ex API and UDP support.
authorEvan Klinger <evan@php.net>
Mon, 20 Dec 1999 00:55:58 +0000 (00:55 +0000)
committerEvan Klinger <evan@php.net>
Mon, 20 Dec 1999 00:55:58 +0000 (00:55 +0000)
@- Added UDP support in fsockopen() (Evan).
# UDP activated with "udp://hostname"

ext/standard/fsock.c

index 3305a4309f4d980be4a947290209e76fa3f52d87..b0df1a22c1028ee0925e5376beedda97e62f51d2 100644 (file)
@@ -236,25 +236,26 @@ PHPAPI int connect_nonb(int sockfd,
    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 @@ static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
                        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 @@ static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
                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 @@ static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
          
                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 @@ static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
   
                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 @@ static void php_fsockopen(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
          
                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;
                }