diff options
author | Daniel Beulshausen <dbeu@php.net> | 2001-05-17 17:02:37 +0000 |
---|---|---|
committer | Daniel Beulshausen <dbeu@php.net> | 2001-05-17 17:02:37 +0000 |
commit | 9820c2a5af9d5a91da02f13a0f704ec4ada1ed15 (patch) | |
tree | ea859777a486b8f8cd02b6f094b027435fff23de /ext/sockets/php_sockets_win.c | |
parent | 5b12d6077e967ba2b3a215066ee9fd4c951f9517 (diff) | |
download | php-git-9820c2a5af9d5a91da02f13a0f704ec4ada1ed15.tar.gz |
update sockets to work with winsock as well
Diffstat (limited to 'ext/sockets/php_sockets_win.c')
-rw-r--r-- | ext/sockets/php_sockets_win.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/ext/sockets/php_sockets_win.c b/ext/sockets/php_sockets_win.c new file mode 100644 index 0000000000..5956781310 --- /dev/null +++ b/ext/sockets/php_sockets_win.c @@ -0,0 +1,175 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Chris Vandomelen <chrisv@b0rked.dhs.org> | + | Sterling Hughes <sterling@php.net> | + | | + | WinSock: Daniel Beulshausen <daniel@php4win.de> | + +----------------------------------------------------------------------+ + */ + +#ifdef PHP_WIN32 + +#include <stdio.h> +#include <fcntl.h> + +#include "php.h" +#include "php_sockets.h" +#include "php_sockets_win.h" + +ssize_t readv(SOCKET sock, const struct iovec *iov, int iovcnt) { + size_t bytes, remain, len, pos = 0; + ssize_t retval; + int i; + char *buffer = NULL; + + for(bytes=0, i=0; i<iovcnt; i++) { + bytes += iov[i].iov_len; + } + + buffer = (char*)emalloc(bytes); + if (buffer == NULL) { + return -1; + } + + retval = recv(sock, buffer, bytes, 0); + if(retval < 0) { + efree(buffer); + return retval; + } + + remain = bytes = (size_t) retval; + + for(i=0; i<iovcnt; i++) { + len = (iov[i].iov_len < remain) ? iov[i].iov_len : remain; + memcpy(iov[i].iov_base, buffer+pos, len); + pos += len; + remain -= len; + } + + efree(buffer); + return bytes; +} + +ssize_t writev(SOCKET sock, const struct iovec *iov, int iovcnt) { + size_t bytes, pos = 0; + ssize_t retval; + int i; + char *buffer = NULL; + + for(bytes=0, i=0; i<iovcnt; i++) { + bytes += iov[i].iov_len; + } + + buffer = (char*)emalloc(bytes); + + if(buffer == NULL) { + return -1; + } + + for(i=0; i<iovcnt; i++) { + memcpy(buffer+pos, iov[i].iov_base, iov[i].iov_len); + pos += iov[i].iov_len; + } + + retval = send(sock, buffer, bytes, 0); + efree(buffer); + + return retval; +} + +ssize_t recvmsg(SOCKET sock, struct msghdr *msg, int flags) { + set_errno(WSAEOPNOTSUPP); + return -1; +} + +ssize_t sendmsg(SOCKET sock, struct msghdr *msg, int flags) { + set_errno(WSAEOPNOTSUPP); + return -1; +} + +int socketpair(int domain, int type, int protocol, SOCKET sock[2]) { + struct sockaddr_in address; + SOCKET redirect; + int size = sizeof(address); + + if(domain != AF_INET) { + set_errno(WSAENOPROTOOPT); + return -1; + } + + + sock[0] = socket(domain, type, protocol); + address.sin_addr.s_addr = INADDR_ANY; + address.sin_family = AF_INET; + address.sin_port = 0; + + bind(sock[0], (struct sockaddr*)&address, sizeof(address)); + if(getsockname(sock[0], (struct sockaddr *)&address, &size) != 0) { + + } + + listen(sock[0], 2); + sock[1] = socket(domain, type, protocol); + address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + connect(sock[1], (struct sockaddr*)&address, sizeof(address)); + redirect = accept(sock[0],(struct sockaddr*)&address, &size); + + close(sock[0]); + sock[0] = redirect; + + if(sock[0] == INVALID_SOCKET ) { + close(sock[0]); + close(sock[1]); + set_errno(WSAECONNABORTED); + return -1; + } + + return 0; +} + +int inet_aton(const char *cp, struct in_addr *inp) { + inp->s_addr = inet_addr(cp); + + if (inp->s_addr == INADDR_NONE) { + return 0; + } + + return 1; +} + +int fcntl(int fd, int cmd, ...) { + va_list va; + int retval; + + va_start(va, cmd); + + switch(cmd) { + case F_GETFL: + case F_SETFD: + case F_GETFD: + default: + retval = -1; + break; + + case F_SETFL: + retval = ioctlsocket(fd, cmd, va_arg(va, int*)); + break; + } + + va_end(va); + return retval; +} +#endif
\ No newline at end of file |