1-3 changes

This commit is contained in:
Manoj Ampalam 2016-01-03 00:25:57 -08:00
parent 2e8a804a2b
commit d47b935039
6 changed files with 164 additions and 23 deletions

View File

@ -60,6 +60,7 @@
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>Ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);C:\openssh\Win32-OpenSSH_\contrib\win32\w32-posix-prototype\win32posix\Debug\win32posix.lib</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

View File

@ -1,5 +1,7 @@
#include "CppUnitTest.h"
extern "C" {
#include "..\win32posix\w32posix.h"
}
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
@ -29,9 +31,66 @@ namespace UnitTests
Assert::AreEqual(0, FD_ISSET(1, set), L"", LINE_INFO());
Assert::AreEqual(0, FD_ISSET(2, set), L"", LINE_INFO());
w32posix_initialize();
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct addrinfo hints, *servinfo, *p;
struct sockaddr_storage their_addr; // connector's address information
socklen_t sin_size;
int yes = 1;
char s[INET6_ADDRSTRLEN];
int rv;
#define PORT "3490" // the port users will be connecting to
#define BACKLOG 10 // how many pending connections queue will hold
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE; // use my IP
if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
}
// loop through all the results and bind to the first we can
for (p = servinfo; p != NULL; p = p->ai_next) {
if ((sockfd = socket(p->ai_family, p->ai_socktype,
p->ai_protocol)) == -1) {
perror("server: socket");
continue;
}
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&yes,
sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) {
close(sockfd);
perror("server: bind");
continue;
}
break;
}
freeaddrinfo(servinfo); // all done with this structure
if (p == NULL) {
fprintf(stderr, "server: failed to bind\n");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
}
};
}

View File

@ -24,6 +24,16 @@ static int getWSAErrno()
return wsaerrno;
}
int socketio_initialize() {
WSADATA wsaData = { 0 };
int iResult = 0;
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
wprintf(L"WSAStartup failed: %d\n", iResult);
return iResult;
}
}
struct w32_io* socketio_socket(int domain, int type, int protocol) {
struct w32_io *pio = (struct w32_io*)malloc(sizeof(struct w32_io));
if (!pio) {
@ -39,20 +49,66 @@ struct w32_io* socketio_socket(int domain, int type, int protocol) {
return NULL;
}
pio->type = SOCK_FD;
return pio;
}
struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
struct w32_io *accept_io = (struct w32_io*)malloc(sizeof(struct w32_io));
struct w32_io *accept_io = NULL;
accept_io = (struct w32_io*)malloc(sizeof(struct w32_io));
if (!accept_io)
{
errno = ENOMEM;
return NULL;
}
accept_io->sock = accept(pio->sock, addr, addrlen);
if (accept_io->sock == INVALID_SOCKET) {
errno = getWSAErrno();
free(accept_io);
return NULL;
}
pio->type = SOCK_FD;
return accept_io;
}
int socketio_setsockopt(struct w32_io* pio, int level, int optname, const char* optval, int optlen);
int socketio_getsockopt(struct w32_io* pio, int level, int optname, char* optval, int* optlen);
int socketio_getsockname(struct w32_io* pio, struct sockaddr* name, int* namelen);
int socketio_getpeername(struct w32_io* pio, struct sockaddr* name, int* namelen);
int socketio_listen(struct w32_io* pio, int backlog);
int socketio_bind(struct w32_io* pio, const struct sockaddr *name, int namelen);
int socketio_connect(struct w32_io* pio, const struct sockaddr* name, int namelen);
int socketio_shutdown(struct w32_io* pio, int how);
int socketio_setsockopt(struct w32_io* pio, int level, int optname, const char* optval, int optlen) {
return setsockopt(pio->sock, level, optname, optval, optlen);
}
int socketio_getsockopt(struct w32_io* pio, int level, int optname, char* optval, int* optlen) {
return getsockopt(pio->sock, level, optname, optval, optlen);
}
int socketio_getsockname(struct w32_io* pio, struct sockaddr* name, int* namelen) {
return getsockname(pio->sock, name, namelen);
}
int socketio_getpeername(struct w32_io* pio, struct sockaddr* name, int* namelen) {
return 0;
}
int socketio_listen(struct w32_io* pio, int backlog) {
return listen(pio->sock, backlog);
}
int socketio_bind(struct w32_io* pio, const struct sockaddr *name, int namelen) {
return bind(pio->sock, name, namelen);
}
int socketio_connect(struct w32_io* pio, const struct sockaddr* name, int namelen) {
return connect(pio->sock, name, namelen);
}
int socketio_shutdown(struct w32_io* pio, int how) {
return shutdown(pio->sock, how);
}
int socketio_close(struct w32_io* pio) {
closesocket(pio->sock);
//todo- wait for pending io to abort
free(pio);
}

View File

@ -11,6 +11,7 @@ struct w32fd_table fd_table;
int fd_table_initialize() {
memset(&fd_table, 0, sizeof(fd_table));
//set stdin, stdout and stderr
return 0;
}
int fd_table_get_min_index() {
@ -44,10 +45,16 @@ void fd_table_set(struct w32_io* pio, int index) {
void fd_table_clear(int index)
{
struct w32_pio* pio = fd_table.w32fds[index];
//pio->table_index = -1;
fd_table.w32fds[index] = NULL;
FD_SET(index, &(fd_table.occupied));
}
void w32posix_initialize() {
socketio_initialize();
}
BOOL w32_io_is_blocking(struct w32_io* pio)
{
return (pio->fd_status_flags & O_NONBLOCK) ? TRUE : FALSE;
@ -67,9 +74,7 @@ int w32_socket(int domain, int type, int protocol) {
return -1;
}
pio->type = SOCK_FD;
fd_table_set(pio, min_index);
return min_index;
}
@ -89,7 +94,7 @@ int w32_accept(int fd, struct sockaddr* addr, int* addrlen)
}
fd_table_set(pio, min_index);
return min_index;
}
int w32_setsockopt(int fd, int level, int optname, const char* optval, int optlen) {
@ -127,6 +132,7 @@ int w32_shutdown(int fd, int how) {
int w32_close(int fd) {
struct w32_io* pio = fd_table.w32fds[fd];
fd_table_clear(pio->table_index);
if ((pio->type == LISTEN_FD) || (pio->type == SOCK_FD)) {
socketio_close(pio);
}

View File

@ -46,8 +46,8 @@ int fd_table_initialize();
int fd_table_add(struct w32_io*);
int fd_table_delete(struct w32_io*);
int socketio_initialize();
struct w32_io* socketio_socket(int domain, int type, int protocol);
struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen);
int socketio_setsockopt(struct w32_io* pio, int level, int optname, const char* optval, int optlen);
int socketio_getsockopt(struct w32_io* pio, int level, int optname, char* optval, int* optlen);

View File

@ -36,15 +36,20 @@ typedef struct w32_fd_set_ {
#define socket w32_socket
/*w32 prototypes of posix functions*/
FILE* w32_fdopen(int fd, const char *mode);
int w32_fstat(int fd, struct stat *buf);
int w32_isatty(int fd);
void w32posix_initialize();
/*network i/o*/
#define socket w32_socket
#define accept w32_accept
#define setsockopt w32_setsockopt
#define getsockopt w32_getsockopt
#define getsockname w32_getsockname
#define getpeername w32_getpeername
#define listen w32_listen
#define bind w32_bind
#define connect w32_connect
#define shutdown w32_shutdown
int w32_socket(int domain, int type, int protocol);
int w32_accept(int fd, struct sockaddr* addr, int* addrlen);
int w32_setsockopt(int fd, int level, int optname, const char* optval, int optlen);
int w32_getsockopt(int fd, int level, int optname, char* optval, int* optlen);
@ -56,16 +61,30 @@ int w32_connect(int fd, const struct sockaddr* name, int namelen);
int w32_shutdown(int fd, int how);
/*non-network i/o*/
#define pipe w32_pipe
#define open w32_open
#define creat w32_creat
#define read w32_read
#define write w32_write
#define fstat w32_fstat
#define isatty w32_isatty
#define fdopen w32_fdopen
int w32_pipe(int *pfds);
int w32_open(const char *pathname, int flags, ...);
int w32_wopen(const wchar_t *pathname, int flags, ...);
int w32_creat(const char *pathname, int mode);
int w32_read(int fd, void *dst, unsigned int max);
int w32_write(int fd, const void *buf, unsigned int max);
int w32_close(int fd);
int w32_fstat(int fd, struct stat *buf);
int w32_isatty(int fd);
FILE* w32_fdopen(int fd, const char *mode);
/*operations on fds*/
int w32_ioctl(int d, int request, ...);
/*common i/o*/
#define close w32_close
#define select w32_select
#define fcntl w32_fcntl
#define dup w32_dup
#define dup2 w32_dup2
int w32_close(int fd);
int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, const struct timeval *timeout);
int w32_fcntl(int fd, int cmd, ... /* arg */);
int w32_dup(int oldfd);