root/ext/standard/fsock.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. php_fsockopen_stream
  2. PHP_FUNCTION
  3. PHP_FUNCTION

   1 /*
   2    +----------------------------------------------------------------------+
   3    | PHP Version 7                                                        |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1997-2016 The PHP Group                                |
   6    +----------------------------------------------------------------------+
   7    | This source file is subject to version 3.01 of the PHP license,      |
   8    | that is bundled with this package in the file LICENSE, and is        |
   9    | available through the world-wide-web at the following url:           |
  10    | http://www.php.net/license/3_01.txt                                  |
  11    | If you did not receive a copy of the PHP license and are unable to   |
  12    | obtain it through the world-wide-web, please send a note to          |
  13    | license@php.net so we can mail you a copy immediately.               |
  14    +----------------------------------------------------------------------+
  15    | Authors: Paul Panotzki - Bunyip Information Systems                  |
  16    |          Jim Winstead <jimw@php.net>                                 |
  17    |          Sascha Schumann <sascha@schumann.cx>                        |
  18    +----------------------------------------------------------------------+
  19 */
  20 
  21 /* $Id$ */
  22 
  23 #include "php.h"
  24 #include "php_globals.h"
  25 #include <stdlib.h>
  26 #include <stddef.h>
  27 #include "php_network.h"
  28 #include "file.h"
  29 
  30 /* {{{ php_fsockopen() */
  31 
  32 static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent)
  33 {
  34         char *host;
  35         size_t host_len;
  36         zend_long port = -1;
  37         zval *zerrno = NULL, *zerrstr = NULL;
  38         double timeout = (double)FG(default_socket_timeout);
  39 #ifndef PHP_WIN32
  40         time_t conv;
  41 #else
  42         long conv;
  43 #endif
  44         struct timeval tv;
  45         char *hashkey = NULL;
  46         php_stream *stream = NULL;
  47         int err;
  48         char *hostname = NULL;
  49         size_t hostname_len;
  50         zend_string *errstr = NULL;
  51 
  52         RETVAL_FALSE;
  53 
  54         if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/z/d", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) {
  55                 RETURN_FALSE;
  56         }
  57 
  58         if (persistent) {
  59                 spprintf(&hashkey, 0, "pfsockopen__%s:" ZEND_LONG_FMT, host, port);
  60         }
  61 
  62         if (port > 0) {
  63                 hostname_len = spprintf(&hostname, 0, "%s:" ZEND_LONG_FMT, host, port);
  64         } else {
  65                 hostname_len = host_len;
  66                 hostname = host;
  67         }
  68 
  69         /* prepare the timeout value for use */
  70 #ifndef PHP_WIN32
  71         conv = (time_t) (timeout * 1000000.0);
  72         tv.tv_sec = conv / 1000000;
  73 #else
  74         conv = (long) (timeout * 1000000.0);
  75         tv.tv_sec = conv / 1000000;
  76 #endif
  77         tv.tv_usec = conv % 1000000;
  78 
  79         if (zerrno)     {
  80                 zval_dtor(zerrno);
  81                 ZVAL_LONG(zerrno, 0);
  82         }
  83         if (zerrstr) {
  84                 zval_dtor(zerrstr);
  85                 ZVAL_EMPTY_STRING(zerrstr);
  86         }
  87 
  88         stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS,
  89                         STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err);
  90 
  91         if (port > 0) {
  92                 efree(hostname);
  93         }
  94         if (stream == NULL) {
  95                 php_error_docref(NULL, E_WARNING, "unable to connect to %s:" ZEND_LONG_FMT " (%s)", host, port, errstr == NULL ? "Unknown error" : ZSTR_VAL(errstr));
  96         }
  97 
  98         if (hashkey) {
  99                 efree(hashkey);
 100         }
 101 
 102         if (stream == NULL)     {
 103                 if (zerrno) {
 104                         zval_dtor(zerrno);
 105                         ZVAL_LONG(zerrno, err);
 106                 }
 107                 if (zerrstr && errstr) {
 108                         /* no need to dup; we need to efree buf anyway */
 109                         zval_dtor(zerrstr);
 110                         ZVAL_STR(zerrstr, errstr);
 111                 } else if (!zerrstr && errstr) {
 112                         zend_string_release(errstr);
 113                 }
 114 
 115                 RETURN_FALSE;
 116         }
 117 
 118         if (errstr) {
 119                 zend_string_release(errstr);
 120         }
 121 
 122         php_stream_to_zval(stream, return_value);
 123 }
 124 
 125 /* }}} */
 126 
 127 /* {{{ proto resource fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])
 128    Open Internet or Unix domain socket connection */
 129 PHP_FUNCTION(fsockopen)
 130 {
 131         php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
 132 }
 133 /* }}} */
 134 
 135 /* {{{ proto resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])
 136    Open persistent Internet or Unix domain socket connection */
 137 PHP_FUNCTION(pfsockopen)
 138 {
 139         php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
 140 }
 141 /* }}} */
 142 
 143 /*
 144  * Local variables:
 145  * tab-width: 4
 146  * c-basic-offset: 4
 147  * End:
 148  * vim600: sw=4 ts=4 fdm=marker
 149  * vim<600: sw=4 ts=4
 150  */

/* [<][>][^][v][top][bottom][index][help] */