unsigned int streams_flags = STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT;
char * hashed_details = NULL;
int hashed_details_len = 0;
- char * errstr = NULL;
+ zend_string *errstr = NULL;
int errcode = 0;
struct timeval tv;
dtor_func_t origin_dtor;
mnd_sprintf_free(hashed_details);
}
errcode = CR_CONNECTION_ERROR;
- SET_CLIENT_ERROR(*error_info, errcode? errcode:CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, errstr);
+ SET_CLIENT_ERROR(*error_info, errcode? errcode:CR_CONNECTION_ERROR, UNKNOWN_SQLSTATE, errstr->val);
if (errstr) {
/* no mnd_ since we don't allocate it */
- efree(errstr);
+ STR_RELEASE(errstr);
}
DBG_RETURN(NULL);
}
clisock = php_network_accept_incoming(sock->s.socket,
xparam->want_textaddr ? &xparam->outputs.textaddr : NULL,
- xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL,
xparam->want_addr ? &xparam->outputs.addr : NULL,
xparam->want_addr ? &xparam->outputs.addrlen : NULL,
xparam->inputs.timeout,
int err;
char *hostname = NULL;
long hostname_len;
- char *errstr = NULL;
+ zend_string *errstr = NULL;
RETVAL_FALSE;
efree(hostname);
}
if (stream == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s:%ld (%s)", host, port, errstr == NULL ? "Unknown error" : errstr);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s:%ld (%s)", host, port, errstr == NULL ? "Unknown error" : errstr->val);
}
if (hashkey) {
if (zerrstr && errstr) {
/* no need to dup; we need to efree buf anyway */
zval_dtor(zerrstr);
- // TODO: avoid reallocation ???
- ZVAL_STRING(zerrstr, errstr);
- efree(errstr);
+ ZVAL_STR(zerrstr, errstr);
} else if (!zerrstr && errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
RETURN_FALSE;
}
if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
php_stream_to_zval(stream, return_value);
char tmp_line[128];
size_t chunk_size = 0, file_size = 0;
int eol_detect = 0;
- char *transport_string, *errstr = NULL;
+ char *transport_string;
+ zend_string *errstr = NULL;
int transport_len, have_header = 0, request_fulluri = 0, ignore_errors = 0;
char *protocol_version = NULL;
int protocol_version_len = 3; /* Default: "1.0" */
}
if (errstr) {
- php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "%s", errstr);
- efree(errstr);
+ php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, "%s", errstr->val);
+ STR_RELEASE(errstr);
errstr = NULL;
}
php_stream *stream = NULL;
int err;
long flags = PHP_STREAM_CLIENT_CONNECT;
- char *errstr = NULL;
+ zend_string *errstr = NULL;
php_stream_context *context = NULL;
RETVAL_FALSE;
/* host might contain binary characters */
zend_string *quoted_host = php_addslashes(host, host_len, 0 TSRMLS_CC);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", quoted_host->val, errstr == NULL ? "Unknown error" : errstr);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", quoted_host->val, errstr == NULL ? "Unknown error" : errstr->val);
STR_RELEASE(quoted_host);
}
ZVAL_LONG(zerrno, err);
}
if (zerrstr && errstr) {
- /* no need to dup; we need to efree buf anyway */
zval_dtor(zerrstr);
- // TODO: avoid reallocation ???
- ZVAL_STRING(zerrstr, errstr);
- efree(errstr);
+ ZVAL_STR(zerrstr, errstr);
} else if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
RETURN_FALSE;
}
if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
php_stream_to_zval(stream, return_value);
php_stream *stream = NULL;
int err = 0;
long flags = STREAM_XPORT_BIND | STREAM_XPORT_LISTEN;
- char *errstr = NULL;
+ zend_string *errstr = NULL;
php_stream_context *context = NULL;
RETVAL_FALSE;
NULL, NULL, context, &errstr, &err);
if (stream == NULL) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : errstr);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : errstr->val);
}
if (stream == NULL) {
ZVAL_LONG(zerrno, err);
}
if (zerrstr && errstr) {
- /* no need to dup; we need to efree buf anyway */
zval_dtor(zerrstr);
- // TODO: avoid reallocation ???
- ZVAL_STRING(zerrstr, errstr);
- efree(errstr);
+ ZVAL_STR(zerrstr, errstr);
} else if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
RETURN_FALSE;
}
if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
php_stream_to_zval(stream, return_value);
{
double timeout = FG(default_socket_timeout);
zval *zpeername = NULL;
- char *peername = NULL;
- int peername_len;
+ zend_string *peername = NULL;
php_timeout_ull conv;
struct timeval tv;
php_stream *stream = NULL, *clistream = NULL;
zval *zstream;
-
- char *errstr = NULL;
+ zend_string *errstr = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|dz/", &zstream, &timeout, &zpeername) == FAILURE) {
RETURN_FALSE;
if (0 == php_stream_xport_accept(stream, &clistream,
zpeername ? &peername : NULL,
- zpeername ? &peername_len : NULL,
NULL, NULL,
&tv, &errstr
TSRMLS_CC) && clistream) {
if (peername) {
- // TODO: avoid reallocation ???
- ZVAL_STRINGL(zpeername, peername, peername_len);
- efree(peername);
+ ZVAL_STR(zpeername, peername);
}
php_stream_to_zval(clistream, return_value);
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "accept failed: %s", errstr ? errstr : "Unknown error");
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "accept failed: %s", errstr ? errstr->val : "Unknown error");
RETVAL_FALSE;
}
if (errstr) {
- efree(errstr);
+ STR_RELEASE(errstr);
}
}
/* }}} */
php_stream *stream;
zval *zstream;
zend_bool want_peer;
- char *name = NULL;
- int name_len;
+ zend_string *name = NULL;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rb", &zstream, &want_peer) == FAILURE) {
RETURN_FALSE;
if (0 != php_stream_xport_get_name(stream, want_peer,
&name,
- &name_len,
NULL, NULL
TSRMLS_CC)) {
RETURN_FALSE;
}
- // TODO: avoid reallocation ???
- RETVAL_STRINGL(name, name_len);
- efree(name);
+ RETVAL_STR(name);
}
/* }}} */
{
php_stream *stream;
zval *zstream, *zremote = NULL;
- char *remote_addr = NULL;
- int remote_addr_len;
+ zend_string *remote_addr = NULL;
long to_read = 0;
zend_string *read_buf;
long flags = 0;
read_buf = STR_ALLOC(to_read, 0);
recvd = php_stream_xport_recvfrom(stream, read_buf->val, to_read, flags, NULL, NULL,
- zremote ? &remote_addr : NULL,
- zremote ? &remote_addr_len : NULL
+ zremote ? &remote_addr : NULL
TSRMLS_CC);
if (recvd >= 0) {
if (zremote) {
- // TODO: avoid reallocation ???
- ZVAL_STRINGL(zremote, remote_addr, remote_addr_len);
- efree(remote_addr);
+ ZVAL_STR(zremote, remote_addr);
}
read_buf->val[recvd] = '\0';
read_buf->len = recvd;
/* {{{ php_hex2bin
*/
-static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen)
+static zend_string *php_hex2bin(const unsigned char *old, const size_t oldlen)
{
size_t target_length = oldlen >> 1;
- register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1);
+ zend_string *str = STR_ALLOC(target_length, 0);
+ unsigned char *ret = (unsigned char *)str->val;
size_t i, j;
+
for (i = j = 0; i < target_length; i++) {
- char c = old[j++];
+ unsigned char c = old[j++];
+ unsigned char d;
+
if (c >= '0' && c <= '9') {
- str[i] = (c - '0') << 4;
+ d = (c - '0') << 4;
} else if (c >= 'a' && c <= 'f') {
- str[i] = (c - 'a' + 10) << 4;
+ d = (c - 'a' + 10) << 4;
} else if (c >= 'A' && c <= 'F') {
- str[i] = (c - 'A' + 10) << 4;
+ d = (c - 'A' + 10) << 4;
} else {
- efree(str);
+ STR_FREE(str);
return NULL;
}
c = old[j++];
if (c >= '0' && c <= '9') {
- str[i] |= c - '0';
+ d |= c - '0';
} else if (c >= 'a' && c <= 'f') {
- str[i] |= c - 'a' + 10;
+ d |= c - 'a' + 10;
} else if (c >= 'A' && c <= 'F') {
- str[i] |= c - 'A' + 10;
+ d |= c - 'A' + 10;
} else {
- efree(str);
+ STR_FREE(str);
return NULL;
}
+ ret[i] = d;
}
- str[target_length] = '\0';
-
- if (newlen)
- *newlen = target_length;
- return (char *)str;
+ return str;
}
/* }}} */
Converts the hex representation of data to binary */
PHP_FUNCTION(hex2bin)
{
- char *result, *data;
- size_t newlen;
- int datalen;
+ zend_string *result, *data;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &datalen) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &data) == FAILURE) {
return;
}
- if (datalen % 2 != 0) {
+ if (data->len % 2 != 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Hexadecimal input string must have an even length");
RETURN_FALSE;
}
- result = php_hex2bin((unsigned char *)data, datalen, &newlen);
+ result = php_hex2bin((unsigned char *)data->val, data->len);
if (!result) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input string must be hexadecimal string");
RETURN_FALSE;
}
- // TODO: avoid reallocation ???
- RETVAL_STRINGL(result, newlen);
- efree(result);
+ RETVAL_STR(result);
}
/* }}} */
orig_str = tmp_str;
}
- /*
+ /*???
refcount = Z_REFCOUNT_P(orig_str);
*/
} else {
repl_str = tmp_repl;
}
- /*
+ /*???
if (Z_REFCOUNT_P(orig_str) != refcount) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument was modified while replacing");
if (Z_TYPE_P(tmp_repl) != IS_STRING) {
/* {{{ php_network_getaddresses
* Returns number of addresses, 0 for none/error
*/
-PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC)
+PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, zend_string **error_string TSRMLS_DC)
{
struct sockaddr **sap;
int n;
if ((n = getaddrinfo(host, NULL, &hints, &res))) {
if (error_string) {
- spprintf(error_string, 0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string);
+ *error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
}
return 0;
} else if (res == NULL) {
if (error_string) {
- spprintf(error_string, 0, "php_network_getaddresses: getaddrinfo failed (null result pointer) errno=%d", errno);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string);
+ *error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed (null result pointer) errno=%d", errno);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: getaddrinfo failed (null result pointer)");
}
host_info = gethostbyname(host);
if (host_info == NULL) {
if (error_string) {
- spprintf(error_string, 0, "php_network_getaddresses: gethostbyname failed. errno=%d", errno);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", *error_string);
+ error_string = strpprintf(0, "php_network_getaddresses: gethostbyname failed. errno=%d", errno);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", (*error_string)->val);
} else {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_network_getaddresses: gethostbyname failed");
}
socklen_t addrlen,
int asynchronous,
struct timeval *timeout,
- char **error_string,
+ zend_string **error_string,
int *error_code)
{
#if HAVE_NON_BLOCKING_CONNECT
if (error != EINPROGRESS) {
if (error_string) {
- *error_string = php_socket_strerror(error, NULL, 0);
+ *error_string = php_socket_error_str(error);
}
return -1;
if (error) {
ret = -1;
if (error_string) {
- *error_string = php_socket_strerror(error, NULL, 0);
+ *error_string = php_socket_error_str(error);
}
}
return ret;
* */
/* {{{ php_network_bind_socket_to_local_addr */
php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port,
- int socktype, long sockopts, char **error_string, int *error_code
+ int socktype, long sockopts, zend_string **error_string, int *error_code
TSRMLS_DC)
{
int num_addrs, n, err = 0;
*error_code = err;
}
if (error_string) {
- *error_string = php_socket_strerror(err, NULL, 0);
+ *error_string = php_socket_error_str(err);
}
bound:
struct sockaddr_in *in4 = (struct sockaddr_in*)sa;
struct sockaddr **psal;
int n;
- char *errstr = NULL;
+ zend_string *errstr = NULL;
#if HAVE_IPV6
struct sockaddr_in6 *in6 = (struct sockaddr_in6*)sa;
#endif
if (n == 0) {
if (errstr) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to resolve `%s': %s", tmp, errstr);
- efree(errstr);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to resolve `%s': %s", tmp, errstr->val);
+ STR_RELEASE(errstr);
}
goto out;
}
/* input address */
struct sockaddr *sa, socklen_t sl,
/* output readable address */
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
/* output address */
struct sockaddr **addr,
socklen_t *addrlen
/* generally not thread safe, but it *is* thread safe under win32 */
buf = inet_ntoa(((struct sockaddr_in*)sa)->sin_addr);
if (buf) {
- *textaddrlen = spprintf(textaddr, 0, "%s:%d",
+ *textaddr = strpprintf(0, "%s:%d",
buf, ntohs(((struct sockaddr_in*)sa)->sin_port));
}
case AF_INET6:
buf = (char*)inet_ntop(sa->sa_family, &((struct sockaddr_in6*)sa)->sin6_addr, (char *)&abuf, sizeof(abuf));
if (buf) {
- *textaddrlen = spprintf(textaddr, 0, "%s:%d",
+ *textaddr = strpprintf(0, "%s:%d",
buf, ntohs(((struct sockaddr_in6*)sa)->sin6_port));
}
if (ua->sun_path[0] == '\0') {
/* abstract name */
int len = strlen(ua->sun_path + 1) + 1;
- *textaddrlen = len;
- *textaddr = emalloc(len + 1);
- memcpy(*textaddr, ua->sun_path, len);
- (*textaddr)[len] = '\0';
+ *textaddr = STR_INIT((char*)ua->sun_path, len, 0);
} else {
- *textaddrlen = strlen(ua->sun_path);
- *textaddr = estrndup(ua->sun_path, *textaddrlen);
+ int len = strlen(ua->sun_path);
+ *textaddr = STR_INIT((char*)ua->sun_path, len, 0);
}
}
break;
}
PHPAPI int php_network_get_peer_name(php_socket_t sock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen
TSRMLS_DC)
if (getpeername(sock, (struct sockaddr*)&sa, &sl) == 0) {
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
- textaddr, textaddrlen,
+ textaddr,
addr, addrlen
TSRMLS_CC);
return 0;
}
PHPAPI int php_network_get_sock_name(php_socket_t sock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen
TSRMLS_DC)
if (getsockname(sock, (struct sockaddr*)&sa, &sl) == 0) {
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
- textaddr, textaddrlen,
+ textaddr,
addr, addrlen
TSRMLS_CC);
return 0;
* using an optional timeout.
* Returns the peer address in addr/addrlen (it will emalloc
* these, so be sure to efree the result).
- * If you specify textaddr/textaddrlen, a text-printable
+ * If you specify textaddr, a text-printable
* version of the address will be emalloc'd and returned.
* */
/* {{{ php_network_accept_incoming */
PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen,
struct timeval *timeout,
- char **error_string,
+ zend_string **error_string,
int *error_code
TSRMLS_DC)
{
if (clisock != SOCK_ERR) {
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
- textaddr, textaddrlen,
+ textaddr,
addr, addrlen
TSRMLS_CC);
} else {
*error_code = error;
}
if (error_string) {
- *error_string = php_socket_strerror(error, NULL, 0);
+ *error_string = php_socket_error_str(error);
}
return clisock;
/* {{{ php_network_connect_socket_to_host */
php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port,
- int socktype, int asynchronous, struct timeval *timeout, char **error_string,
+ int socktype, int asynchronous, struct timeval *timeout, zend_string **error_string,
int *error_code, char *bindto, unsigned short bindport, long sockopts
TSRMLS_DC)
{
}
/* free error string received during previous iteration (if any) */
if (error_string && *error_string) {
- efree(*error_string);
+ STR_RELEASE(*error_string);
*error_string = NULL;
}
}
/* }}} */
+/* {{{ php_socket_error_str */
+PHPAPI zend_string *php_socket_error_str(long err)
+{
+#ifndef PHP_WIN32
+ char *errstr;
+
+ errstr = strerror(err);
+ return STR_INIT(errstr, strlen(errstr), 0);
+#else
+ zend_string *ret;
+ char *sysbuf;
+ int free_it = 1;
+
+ if (!FormatMessage(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ err,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR)&sysbuf,
+ 0,
+ NULL)) {
+ free_it = 0;
+ sysbuf = "Unknown Error";
+ }
+
+ ret = STR_INIT(sysbuf, strlen(sysbuf), 0);
+
+ if (free_it) {
+ LocalFree(sysbuf);
+ }
+
+ return ret;
+#endif
+}
+/* }}} */
+
/* deprecated */
PHPAPI php_stream *_php_stream_sock_open_from_socket(php_socket_t socket, const char *persistent_id STREAMS_DC TSRMLS_DC)
{
* Also works sensibly for win32 */
BEGIN_EXTERN_C()
PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize);
+PHPAPI zend_string *php_socket_error_str(long err);
END_EXTERN_C()
#ifdef HAVE_NETINET_IN_H
#endif
BEGIN_EXTERN_C()
-PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, char **error_string TSRMLS_DC);
+PHPAPI int php_network_getaddresses(const char *host, int socktype, struct sockaddr ***sal, zend_string **error_string TSRMLS_DC);
PHPAPI void php_network_freeaddresses(struct sockaddr **sal);
PHPAPI php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short port,
- int socktype, int asynchronous, struct timeval *timeout, char **error_string,
+ int socktype, int asynchronous, struct timeval *timeout, zend_string **error_string,
int *error_code, char *bindto, unsigned short bindport, long sockopts
TSRMLS_DC);
socklen_t addrlen,
int asynchronous,
struct timeval *timeout,
- char **error_string,
+ zend_string **error_string,
int *error_code);
#define php_connect_nonb(sock, addr, addrlen, timeout) \
php_network_connect_socket((sock), (addr), (addrlen), 0, (timeout), NULL, NULL)
PHPAPI php_socket_t php_network_bind_socket_to_local_addr(const char *host, unsigned port,
- int socktype, long sockopts, char **error_string, int *error_code
+ int socktype, long sockopts, zend_string **error_string, int *error_code
TSRMLS_DC);
PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen,
struct timeval *timeout,
- char **error_string,
+ zend_string **error_string,
int *error_code
TSRMLS_DC);
PHPAPI int php_network_get_sock_name(php_socket_t sock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen
TSRMLS_DC);
PHPAPI int php_network_get_peer_name(php_socket_t sock,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr,
socklen_t *addrlen
TSRMLS_DC);
/* input address */
struct sockaddr *sa, socklen_t sl,
/* output readable address */
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
/* output address */
struct sockaddr **addr,
socklen_t *addrlen
int flags, const char *persistent_id,
struct timeval *timeout,
php_stream_context *context,
- char **error_string,
+ zend_string **error_string,
int *error_code
STREAMS_DC TSRMLS_DC);
/* Bind the stream to a local address */
PHPAPI int php_stream_xport_bind(php_stream *stream,
const char *name, size_t namelen,
- char **error_text
+ zend_string **error_text
TSRMLS_DC);
/* Connect to a remote address */
const char *name, size_t namelen,
int asynchronous,
struct timeval *timeout,
- char **error_text,
+ zend_string **error_text,
int *error_code
TSRMLS_DC);
/* Prepare to listen */
PHPAPI int php_stream_xport_listen(php_stream *stream,
int backlog,
- char **error_text
+ zend_string **error_text
TSRMLS_DC);
/* Get the next client and their address as a string, or the underlying address
* structure. You must efree either of these if you request them */
PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client,
- char **textaddr, int *textaddrlen,
+ zend_string **textaddr,
void **addr, socklen_t *addrlen,
struct timeval *timeout,
- char **error_text
+ zend_string **error_text
TSRMLS_DC);
/* Get the name of either the socket or it's peer */
PHPAPI int php_stream_xport_get_name(php_stream *stream, int want_peer,
- char **textaddr, int *textaddrlen,
+ zend_string **textaddr,
void **addr, socklen_t *addrlen
TSRMLS_DC);
* peeking, optionally retrieving OOB data */
PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t buflen,
long flags, void **addr, socklen_t *addrlen,
- char **textaddr, int *textaddrlen TSRMLS_DC);
+ zend_string **textaddr TSRMLS_DC);
/* Similar to send() system call; send data to the stream, optionally
* sending it as OOB data */
int returncode;
struct sockaddr *addr;
socklen_t addrlen;
- char *textaddr;
- long textaddrlen;
-
- char *error_text;
+ zend_string *textaddr;
+ zend_string *error_text;
int error_code;
} outputs;
} php_stream_xport_param;
}
#define ERR_REPORT(out_err, fmt, arg) \
- if (out_err) { spprintf(out_err, 0, fmt, arg); } \
+ if (out_err) { *out_err = strpprintf(0, fmt, arg); } \
else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, arg); }
#define ERR_RETURN(out_err, local_err, fmt) \
if (out_err) { *out_err = local_err; } \
- else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, local_err ? local_err : "Unspecified error"); \
- if (local_err) { efree(local_err); local_err = NULL; } \
+ else { php_error_docref(NULL TSRMLS_CC, E_WARNING, fmt, local_err ? local_err->val : "Unspecified error"); \
+ if (local_err) { STR_RELEASE(local_err); local_err = NULL; } \
}
PHPAPI php_stream *_php_stream_xport_create(const char *name, size_t namelen, int options,
int flags, const char *persistent_id,
struct timeval *timeout,
php_stream_context *context,
- char **error_string,
+ zend_string **error_string,
int *error_code
STREAMS_DC TSRMLS_DC)
{
php_stream_transport_factory factory = NULL;
const char *p, *protocol = NULL;
int n = 0, failed = 0;
- char *error_text = NULL;
+ zend_string *error_text = NULL;
struct timeval default_timeout = { 0, 0 };
default_timeout.tv_sec = FG(default_socket_timeout);
/* Bind the stream to a local address */
PHPAPI int php_stream_xport_bind(php_stream *stream,
const char *name, size_t namelen,
- char **error_text
+ zend_string **error_text
TSRMLS_DC)
{
php_stream_xport_param param;
const char *name, size_t namelen,
int asynchronous,
struct timeval *timeout,
- char **error_text,
+ zend_string **error_text,
int *error_code
TSRMLS_DC)
{
}
/* Prepare to listen */
-PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, char **error_text TSRMLS_DC)
+PHPAPI int php_stream_xport_listen(php_stream *stream, int backlog, zend_string **error_text TSRMLS_DC)
{
php_stream_xport_param param;
int ret;
/* Get the next client and their address (as a string) */
PHPAPI int php_stream_xport_accept(php_stream *stream, php_stream **client,
- char **textaddr, int *textaddrlen,
+ zend_string **textaddr,
void **addr, socklen_t *addrlen,
struct timeval *timeout,
- char **error_text
+ zend_string **error_text
TSRMLS_DC)
{
php_stream_xport_param param;
}
if (textaddr) {
*textaddr = param.outputs.textaddr;
- *textaddrlen = param.outputs.textaddrlen;
}
if (error_text) {
*error_text = param.outputs.error_text;
}
PHPAPI int php_stream_xport_get_name(php_stream *stream, int want_peer,
- char **textaddr, int *textaddrlen,
+ zend_string **textaddr,
void **addr, socklen_t *addrlen
TSRMLS_DC)
{
}
if (textaddr) {
*textaddr = param.outputs.textaddr;
- *textaddrlen = param.outputs.textaddrlen;
}
return param.outputs.returncode;
/* Similar to recv() system call; read data from the stream, optionally
* peeking, optionally retrieving OOB data */
PHPAPI int php_stream_xport_recvfrom(php_stream *stream, char *buf, size_t buflen,
- long flags, void **addr, socklen_t *addrlen, char **textaddr, int *textaddrlen
+ long flags, void **addr, socklen_t *addrlen, zend_string **textaddr
TSRMLS_DC)
{
php_stream_xport_param param;
}
if (textaddr) {
*textaddr = param.outputs.textaddr;
- *textaddrlen = param.outputs.textaddrlen;
}
return recvd_len + param.outputs.returncode;
}
}
static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t buflen, int flags,
- char **textaddr, long *textaddrlen,
+ zend_string **textaddr,
struct sockaddr **addr, socklen_t *addrlen
TSRMLS_DC)
{
ret = recvfrom(sock->socket, buf, buflen, flags, (struct sockaddr*)&sa, &sl);
ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
- textaddr, textaddrlen, addr, addrlen TSRMLS_CC);
+ textaddr, addr, addrlen TSRMLS_CC);
} else {
ret = recv(sock->socket, buf, buflen, flags);
ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
case STREAM_XPORT_OP_GET_NAME:
xparam->outputs.returncode = php_network_get_sock_name(sock->socket,
xparam->want_textaddr ? &xparam->outputs.textaddr : NULL,
- xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL,
xparam->want_addr ? &xparam->outputs.addr : NULL,
xparam->want_addr ? &xparam->outputs.addrlen : NULL
TSRMLS_CC);
case STREAM_XPORT_OP_GET_PEER_NAME:
xparam->outputs.returncode = php_network_get_peer_name(sock->socket,
xparam->want_textaddr ? &xparam->outputs.textaddr : NULL,
- xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL,
xparam->want_addr ? &xparam->outputs.addr : NULL,
xparam->want_addr ? &xparam->outputs.addrlen : NULL
TSRMLS_CC);
xparam->inputs.buf, xparam->inputs.buflen,
flags,
xparam->want_textaddr ? &xparam->outputs.textaddr : NULL,
- xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL,
xparam->want_addr ? &xparam->outputs.addr : NULL,
xparam->want_addr ? &xparam->outputs.addrlen : NULL
TSRMLS_CC);
}
#endif
-static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, char **err TSRMLS_DC)
+static inline char *parse_ip_address_ex(const char *str, size_t str_len, int *portno, int get_err, zend_string **err TSRMLS_DC)
{
char *colon;
char *host = NULL;
p = memchr(str + 1, ']', str_len - 2);
if (!p || *(p + 1) != ':') {
if (get_err) {
- spprintf(err, 0, "Failed to parse IPv6 address \"%s\"", str);
+ *err = strpprintf(0, "Failed to parse IPv6 address \"%s\"", str);
}
return NULL;
}
host = estrndup(str, colon - str);
} else {
if (get_err) {
- spprintf(err, 0, "Failed to parse address \"%s\"", str);
+ *err = strpprintf(0, "Failed to parse address \"%s\"", str);
}
return NULL;
}
if (sock->socket == SOCK_ERR) {
if (xparam->want_errortext) {
- spprintf(&xparam->outputs.error_text, 0, "Failed to create unix%s socket %s",
+ xparam->outputs.error_text = strpprintf(0, "Failed to create unix%s socket %s",
stream->ops == &php_stream_unix_socket_ops ? "" : "datagram",
strerror(errno));
}
if (sock->socket == SOCK_ERR) {
if (xparam->want_errortext) {
- spprintf(&xparam->outputs.error_text, 0, "Failed to create unix socket");
+ xparam->outputs.error_text = strpprintf(0, "Failed to create unix socket");
}
return -1;
}
if (PHP_STREAM_CONTEXT(stream) && (tmpzval = php_stream_context_get_option(PHP_STREAM_CONTEXT(stream), "socket", "bindto")) != NULL) {
if (Z_TYPE_P(tmpzval) != IS_STRING) {
if (xparam->want_errortext) {
- spprintf(&xparam->outputs.error_text, 0, "local_addr context option is not a string.");
+ xparam->outputs.error_text = strpprintf(0, "local_addr context option is not a string.");
}
efree(host);
return -1;
clisock = php_network_accept_incoming(sock->socket,
xparam->want_textaddr ? &xparam->outputs.textaddr : NULL,
- xparam->want_textaddr ? &xparam->outputs.textaddrlen : NULL,
xparam->want_addr ? &xparam->outputs.addr : NULL,
xparam->want_addr ? &xparam->outputs.addrlen : NULL,
xparam->inputs.timeout,
efree(buf);
} /* }}} */
-static int php_network_listen_socket(const char *host, int *port, int socktype, int *af, socklen_t *socklen, char **errstr TSRMLS_DC) /* {{{ */
+static int php_network_listen_socket(const char *host, int *port, int socktype, int *af, socklen_t *socklen, zend_string **errstr TSRMLS_DC) /* {{{ */
{
int retval = SOCK_ERR;
int err = 0;
closesocket(retval);
}
if (errstr) {
- *errstr = php_socket_strerror(err, NULL, 0);
+ *errstr = php_socket_error_str(err);
}
return SOCK_ERR;
}
client->addr = addr;
client->addr_len = addr_len;
{
- char *addr_str = 0;
- long addr_str_len = 0;
- php_network_populate_name_from_sockaddr(addr, addr_len, &addr_str, &addr_str_len, NULL, 0 TSRMLS_CC);
- client->addr_str = pestrndup(addr_str, addr_str_len, 1);
- client->addr_str_len = addr_str_len;
- efree(addr_str);
+ zend_string *addr_str = 0;
+
+ php_network_populate_name_from_sockaddr(addr, addr_len, &addr_str, NULL, 0 TSRMLS_CC);
+ client->addr_str = pestrndup(addr_str->val, addr_str->len, 1);
+ client->addr_str_len = addr_str->len;
+ STR_RELEASE(addr_str);
}
php_http_parser_init(&client->parser, PHP_HTTP_REQUEST);
client->request_read = 0;
{
int retval = SUCCESS;
char *host = NULL;
- char *errstr = NULL;
+ zend_string *errstr = NULL;
char *_document_root = NULL;
char *_router = NULL;
int err = 0;
server_sock = php_network_listen_socket(host, &port, SOCK_STREAM, &server->address_family, &server->socklen, &errstr TSRMLS_CC);
if (server_sock == SOCK_ERR) {
- php_cli_server_logf("Failed to listen on %s:%d (reason: %s)" TSRMLS_CC, host, port, errstr ? errstr: "?");
- efree(errstr);
+ php_cli_server_logf("Failed to listen on %s:%d (reason: %s)" TSRMLS_CC, host, port, errstr ? errstr->val : "?");
+ if (errstr) {
+ STR_RELEASE(errstr);
+ }
retval = FAILURE;
goto out;
}