1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 6 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 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 276986 2009-03-10 23:40:06Z helly $ */
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 20 : {
34 : char *host;
35 : int host_len;
36 20 : long port = -1;
37 20 : zval *zerrno = NULL, *zerrstr = NULL;
38 20 : double timeout = FG(default_socket_timeout);
39 : unsigned long conv;
40 : struct timeval tv;
41 20 : char *hashkey = NULL;
42 20 : php_stream *stream = NULL;
43 : int err;
44 20 : char *hostname = NULL;
45 : long hostname_len;
46 20 : char *errstr = NULL;
47 :
48 20 : RETVAL_FALSE;
49 :
50 20 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lzzd", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) {
51 2 : RETURN_FALSE;
52 : }
53 :
54 18 : if (persistent) {
55 0 : spprintf(&hashkey, 0, "pfsockopen__%s:%ld", host, port);
56 : }
57 :
58 18 : if (port > 0) {
59 8 : hostname_len = spprintf(&hostname, 0, "%s:%ld", host, port);
60 : } else {
61 10 : hostname_len = host_len;
62 10 : hostname = host;
63 : }
64 :
65 : /* prepare the timeout value for use */
66 18 : conv = (unsigned long) (timeout * 1000000.0);
67 18 : tv.tv_sec = conv / 1000000;
68 18 : tv.tv_usec = conv % 1000000;
69 :
70 18 : if (zerrno) {
71 5 : zval_dtor(zerrno);
72 5 : ZVAL_LONG(zerrno, 0);
73 : }
74 18 : if (zerrstr) {
75 5 : zval_dtor(zerrstr);
76 5 : ZVAL_STRING(zerrstr, "", 1);
77 : }
78 :
79 18 : stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS,
80 : STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err);
81 :
82 18 : if (port > 0) {
83 8 : efree(hostname);
84 : }
85 18 : if (stream == NULL) {
86 2 : 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 18 : if (hashkey) {
90 0 : efree(hashkey);
91 : }
92 :
93 18 : if (stream == NULL) {
94 2 : if (zerrno) {
95 2 : zval_dtor(zerrno);
96 2 : ZVAL_LONG(zerrno, err);
97 : }
98 4 : if (zerrstr && errstr) {
99 : /* no need to dup; we need to efree buf anyway */
100 2 : zval_dtor(zerrstr);
101 2 : ZVAL_RT_STRING(zerrstr, errstr, ZSTR_AUTOFREE);
102 : }
103 0 : else if (!zerrstr && errstr) {
104 0 : efree(errstr);
105 : }
106 :
107 2 : RETURN_FALSE;
108 : }
109 :
110 16 : if (errstr) {
111 0 : efree(errstr);
112 : }
113 :
114 16 : 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]]]) U
120 : Open Internet or Unix domain socket connection */
121 : PHP_FUNCTION(fsockopen)
122 20 : {
123 20 : php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
124 20 : }
125 : /* }}} */
126 :
127 : /* {{{ proto resource pfsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]]]) U
128 : Open persistent Internet or Unix domain socket connection */
129 : PHP_FUNCTION(pfsockopen)
130 0 : {
131 0 : php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
132 0 : }
133 : /* }}} */
134 :
135 : /*
136 : * Local variables:
137 : * tab-width: 4
138 : * c-basic-offset: 4
139 : * End:
140 : * vim600: sw=4 ts=4 fdm=marker
141 : * vim<600: sw=4 ts=4
142 : */
|