/* {{{ my_accept */ int my_accept(ftpbuf_t *ftp, php_socket_t s, struct sockaddr *addr, socklen_t *addrlen) { int n; n = php_pollfd_for_ms(s, PHP_POLLREADABLE, ftp->timeout_sec * 1000); if (n < 1) { #ifdef PHP_WIN32 if (n == 0) { _set_errno(ETIMEDOUT); } #else if (n == 0) { errno = ETIMEDOUT; } #endif return -1; } return accept(s, addr, addrlen); }
/* {{{ data_writeable */ int data_writeable(ftpbuf_t *ftp, php_socket_t s) { int n; n = php_pollfd_for_ms(s, POLLOUT, 1000); if (n < 1) { #ifdef PHP_WIN32 if (n == 0) { _set_errno(ETIMEDOUT); } #else if (n == 0) { errno = ETIMEDOUT; } #endif return 0; } return 1; }
/* {{{ data_available */ int data_available(ftpbuf_t *ftp, php_socket_t s) { int n; n = php_pollfd_for_ms(s, PHP_POLLREADABLE, 1000); if (n < 1) { #ifdef PHP_WIN32 if (n == 0) { _set_errno(ETIMEDOUT); } #elif !(defined(NETWARE) && defined(USE_WINSOCK)) if (n == 0) { errno = ETIMEDOUT; } #endif return 0; } return 1; }
/* {{{ my_recv */ int my_recv(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len) { int n, nr_bytes; #ifdef HAVE_FTP_SSL int err; zend_bool retry = 0; SSL *handle = NULL; php_socket_t fd; #endif n = php_pollfd_for_ms(s, PHP_POLLREADABLE, ftp->timeout_sec * 1000); if (n < 1) { #ifdef PHP_WIN32 if (n == 0) { _set_errno(ETIMEDOUT); } #else if (n == 0) { errno = ETIMEDOUT; } #endif return -1; } #ifdef HAVE_FTP_SSL if (ftp->use_ssl && ftp->fd == s && ftp->ssl_active) { handle = ftp->ssl_handle; fd = ftp->fd; } else if (ftp->use_ssl && ftp->fd != s && ftp->use_ssl_for_data && ftp->data->ssl_active) { handle = ftp->data->ssl_handle; fd = ftp->data->fd; } if (handle) { do { nr_bytes = SSL_read(handle, buf, len); err = SSL_get_error(handle, nr_bytes); switch (err) { case SSL_ERROR_NONE: retry = 0; break; case SSL_ERROR_ZERO_RETURN: retry = 0; SSL_shutdown(handle); break; case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_CONNECT: { php_pollfd p; int i; p.fd = fd; p.events = POLLIN|POLLPRI; p.revents = 0; i = php_poll2(&p, 1, 300); retry = i > 0; } break; default: php_error_docref(NULL, E_WARNING, "SSL read failed"); return -1; } } while (retry); } else { #endif nr_bytes = recv(s, buf, len, 0); #ifdef HAVE_FTP_SSL } #endif return (nr_bytes); }
/* {{{ my_send */ int my_send(ftpbuf_t *ftp, php_socket_t s, void *buf, size_t len) { zend_long size, sent; int n; #ifdef HAVE_FTP_SSL int err; zend_bool retry = 0; SSL *handle = NULL; php_socket_t fd; #endif size = len; while (size) { n = php_pollfd_for_ms(s, POLLOUT, ftp->timeout_sec * 1000); if (n < 1) { #ifdef PHP_WIN32 if (n == 0) { _set_errno(ETIMEDOUT); } #else if (n == 0) { errno = ETIMEDOUT; } #endif return -1; } #ifdef HAVE_FTP_SSL if (ftp->use_ssl && ftp->fd == s && ftp->ssl_active) { handle = ftp->ssl_handle; fd = ftp->fd; } else if (ftp->use_ssl && ftp->fd != s && ftp->use_ssl_for_data && ftp->data->ssl_active) { handle = ftp->data->ssl_handle; fd = ftp->data->fd; } if (handle) { do { sent = SSL_write(handle, buf, size); err = SSL_get_error(handle, sent); switch (err) { case SSL_ERROR_NONE: retry = 0; break; case SSL_ERROR_ZERO_RETURN: retry = 0; SSL_shutdown(handle); break; case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_CONNECT: { php_pollfd p; int i; p.fd = fd; p.events = POLLOUT; p.revents = 0; i = php_poll2(&p, 1, 300); retry = i > 0; } break; default: php_error_docref(NULL, E_WARNING, "SSL write failed"); return -1; } } while (retry); } else { #endif sent = send(s, buf, size, 0); #ifdef HAVE_FTP_SSL } #endif if (sent == -1) { return -1; } buf = (char*) buf + sent; size -= sent; } return len; }