1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2007 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,v 1.121.2.1.2.1 2007/01/01 09:36:08 sebastian Exp $ */
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 14 : {
34 : char *host;
35 : int host_len;
36 14 : long port = -1;
37 14 : zval *zerrno = NULL, *zerrstr = NULL;
38 14 : double timeout = FG(default_socket_timeout);
39 : unsigned long conv;
40 : struct timeval tv;
41 14 : char *hashkey = NULL;
42 14 : php_stream *stream = NULL;
43 : int err;
44 14 : char *hostname = NULL;
45 : long hostname_len;
46 14 : char *errstr = NULL;
47 :
48 14 : RETVAL_FALSE;
49 :
50 14 : if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lzzd", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) {
51 0 : RETURN_FALSE;
52 : }
53 :
54 14 : if (persistent) {
55 0 : spprintf(&hashkey, 0, "pfsockopen__%s:%ld", host, port);
56 : }
57 :
58 14 : if (port > 0) {
59 14 : hostname_len = spprintf(&hostname, 0, "%s:%ld", host, port);
60 : } else {
61 0 : hostname_len = host_len;
62 0 : hostname = host;
63 : }
64 :
65 : /* prepare the timeout value for use */
66 14 : conv = (unsigned long) (timeout * 1000000.0);
67 14 : tv.tv_sec = conv / 1000000;
68 14 : tv.tv_usec = conv % 1000000;
69 :
70 14 : if (zerrno) {
71 0 : zval_dtor(zerrno);
72 0 : ZVAL_LONG(zerrno, 0);
73 : }
74 14 : if (zerrstr) {
75 0 : zval_dtor(zerrstr);
76 0 : ZVAL_STRING(zerrstr, "", 1);
77 : }
78 :
79 14 : 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 14 : if (port > 0) {
83 14 : efree(hostname);
84 : }
85 14 : if (stream == NULL) {
86 0 : 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 14 : if (hashkey) {
90 0 : efree(hashkey);
91 : }
92 :
93 14 : if (stream == NULL) {
94 0 : if (zerrno) {
95 0 : zval_dtor(zerrno);
96 0 : ZVAL_LONG(zerrno, err);
97 : }
98 0 : if (zerrstr && errstr) {
99 : /* no need to dup; we need to efree buf anyway */
100 0 : zval_dtor(zerrstr);
101 0 : ZVAL_STRING(zerrstr, errstr, 0);
102 : }
103 0 : else if (!zerrstr && errstr) {
104 0 : efree(errstr);
105 : }
106 :
107 0 : RETURN_FALSE;
108 : }
109 :
110 14 : if (errstr) {
111 0 : efree(errstr);
112 : }
113 :
114 14 : 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 14 : {
123 14 : php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
124 14 : }
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 0 : {
130 0 : php_fsockopen_stream(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
131 0 : }
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 : */
|