Annotation of embedaddon/php/ext/standard/fsock.c, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | PHP Version 5 |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1997-2012 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: fsock.c 321634 2012-01-01 13:15:04Z felipe $ */
! 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: int host_len;
! 36: long port = -1;
! 37: zval *zerrno = NULL, *zerrstr = NULL;
! 38: double timeout = FG(default_socket_timeout);
! 39: unsigned long conv;
! 40: struct timeval tv;
! 41: char *hashkey = NULL;
! 42: php_stream *stream = NULL;
! 43: int err;
! 44: char *hostname = NULL;
! 45: long hostname_len;
! 46: char *errstr = NULL;
! 47:
! 48: RETVAL_FALSE;
! 49:
! 50: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lzzd", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) {
! 51: RETURN_FALSE;
! 52: }
! 53:
! 54: if (persistent) {
! 55: spprintf(&hashkey, 0, "pfsockopen__%s:%ld", host, port);
! 56: }
! 57:
! 58: if (port > 0) {
! 59: hostname_len = spprintf(&hostname, 0, "%s:%ld", host, port);
! 60: } else {
! 61: hostname_len = host_len;
! 62: hostname = host;
! 63: }
! 64:
! 65: /* prepare the timeout value for use */
! 66: conv = (unsigned long) (timeout * 1000000.0);
! 67: tv.tv_sec = conv / 1000000;
! 68: tv.tv_usec = conv % 1000000;
! 69:
! 70: if (zerrno) {
! 71: zval_dtor(zerrno);
! 72: ZVAL_LONG(zerrno, 0);
! 73: }
! 74: if (zerrstr) {
! 75: zval_dtor(zerrstr);
! 76: ZVAL_STRING(zerrstr, "", 1);
! 77: }
! 78:
! 79: stream = php_stream_xport_create(hostname, hostname_len, ENFORCE_SAFE_MODE | REPORT_ERRORS,
! 80: STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err);
! 81:
! 82: if (port > 0) {
! 83: efree(hostname);
! 84: }
! 85: if (stream == NULL) {
! 86: php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s:%ld (%s)", host, port, errstr == NULL ? "Unknown error" : errstr);
! 87: }
! 88:
! 89: if (hashkey) {
! 90: efree(hashkey);
! 91: }
! 92:
! 93: if (stream == NULL) {
! 94: if (zerrno) {
! 95: zval_dtor(zerrno);
! 96: ZVAL_LONG(zerrno, err);
! 97: }
! 98: if (zerrstr && errstr) {
! 99: /* no need to dup; we need to efree buf anyway */
! 100: zval_dtor(zerrstr);
! 101: ZVAL_STRING(zerrstr, errstr, 0);
! 102: }
! 103: else if (!zerrstr && errstr) {
! 104: efree(errstr);
! 105: }
! 106:
! 107: RETURN_FALSE;
! 108: }
! 109:
! 110: if (errstr) {
! 111: efree(errstr);
! 112: }
! 113:
! 114: php_stream_to_zval(stream, return_value);
! 115: }
! 116:
! 117: /* }}} */
! 118:
! 119: /* {{{ proto resource fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])
! 120: Open Internet or Unix domain socket connection */
! 121: PHP_FUNCTION(fsockopen)
! 122: {
! 123: php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
! 124: }
! 125: /* }}} */
! 126: /* {{{ proto resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]])
! 127: Open persistent Internet or Unix domain socket connection */
! 128: PHP_FUNCTION(pfsockopen)
! 129: {
! 130: php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
! 131: }
! 132: /* }}} */
! 133:
! 134: /*
! 135: * Local variables:
! 136: * tab-width: 4
! 137: * c-basic-offset: 4
! 138: * End:
! 139: * vim600: sw=4 ts=4 fdm=marker
! 140: * vim<600: sw=4 ts=4
! 141: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>