diff options
-rw-r--r-- | ext/ftp/ftp.c | 7 | ||||
-rw-r--r-- | main/network.c | 22 | ||||
-rw-r--r-- | main/php_network.h | 1 |
3 files changed, 27 insertions, 3 deletions
diff --git a/ext/ftp/ftp.c b/ext/ftp/ftp.c index e44186ec39..4b1915fe75 100644 --- a/ext/ftp/ftp.c +++ b/ext/ftp/ftp.c @@ -117,7 +117,7 @@ ftp_open(const char *host, short port, long timeout_sec) return NULL; } - ftp->fd = php_hostconnect(host, port ? port : 21, SOCK_STREAM, (int) timeout_sec); + ftp->fd = php_hostconnect(host, (unsigned short) (port ? port : 21), SOCK_STREAM, (int) timeout_sec); if (ftp->fd == -1) { goto bail; } @@ -1050,14 +1050,14 @@ ftp_getdata(ftpbuf_t *ftp) goto bail; } - size = sizeof(php_sockaddr_storage); - /* passive connection handler */ if (ftp->pasv) { /* clear the ready status */ ftp->pasv = 1; /* connect */ + /* Win 95/98 seems not to like size > sizeof(sockaddr_in) */ + size = php_sockaddr_size(&ftp->pasvaddr); tv.tv_sec = ftp->timeout_sec; tv.tv_usec = 0; if (php_connect_nonb(fd, (struct sockaddr*) &ftp->pasvaddr, size, &tv) == -1) { @@ -1075,6 +1075,7 @@ ftp_getdata(ftpbuf_t *ftp) /* bind to a local address */ php_any_addr(sa->sa_family, &addr, 0); + size = php_sockaddr_size(&addr); if (bind(fd, (struct sockaddr*) &addr, size) == -1) { perror("bind"); diff --git a/main/network.c b/main/network.c index 5dd6b6ed3a..804784521a 100644 --- a/main/network.c +++ b/main/network.c @@ -386,6 +386,28 @@ void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port) } /* }}} */ +/* {{{ php_sockaddr_size + * Returns the size of struct sockaddr_xx for the family + */ +int php_sockaddr_size(php_sockaddr_storage *addr) +{ + switch (((struct sockaddr *)addr)->sa_family) { + case AF_INET: + return sizeof(struct sockaddr_in); +#ifdef AF_INET6 + case AF_INET6: + return sizeof(struct sockaddr_in6); +#endif +#ifdef AF_UNIX + case AF_UNIX: + return sizeof(struct sockaddr_un); +#endif + default: + return 0; + } +} +/* }}} */ + /* * Local variables: * tab-width: 8 diff --git a/main/php_network.h b/main/php_network.h index b5c7363c55..dbb3be4627 100644 --- a/main/php_network.h +++ b/main/php_network.h @@ -54,6 +54,7 @@ typedef struct { int php_hostconnect(const char *host, unsigned short port, int socktype, int timeout); PHPAPI int php_connect_nonb(int sockfd, const struct sockaddr *addr, socklen_t addrlen, struct timeval *timeout); void php_any_addr(int family, php_sockaddr_storage *addr, unsigned short port); +int php_sockaddr_size(php_sockaddr_storage *addr); #endif /* _PHP_NETWORK_H */ |