mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-07-23 14:04:59 +02:00
1-3 changes
This commit is contained in:
parent
2e8a804a2b
commit
d47b935039
@ -60,6 +60,7 @@
|
|||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
<AdditionalLibraryDirectories>$(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
<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>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#include "CppUnitTest.h"
|
#include "CppUnitTest.h"
|
||||||
|
extern "C" {
|
||||||
#include "..\win32posix\w32posix.h"
|
#include "..\win32posix\w32posix.h"
|
||||||
|
}
|
||||||
|
|
||||||
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
|
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(1, set), L"", LINE_INFO());
|
||||||
Assert::AreEqual(0, FD_ISSET(2, 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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -24,6 +24,16 @@ static int getWSAErrno()
|
|||||||
return wsaerrno;
|
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* socketio_socket(int domain, int type, int protocol) {
|
||||||
struct w32_io *pio = (struct w32_io*)malloc(sizeof(struct w32_io));
|
struct w32_io *pio = (struct w32_io*)malloc(sizeof(struct w32_io));
|
||||||
if (!pio) {
|
if (!pio) {
|
||||||
@ -39,20 +49,66 @@ struct w32_io* socketio_socket(int domain, int type, int protocol) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pio->type = SOCK_FD;
|
||||||
return pio;
|
return pio;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen) {
|
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;
|
return accept_io;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int socketio_setsockopt(struct w32_io* pio, int level, int optname, const char* optval, int optlen);
|
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);
|
return setsockopt(pio->sock, level, optname, optval, 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_getsockopt(struct w32_io* pio, int level, int optname, char* optval, int* optlen) {
|
||||||
int socketio_bind(struct w32_io* pio, const struct sockaddr *name, int namelen);
|
return getsockopt(pio->sock, level, optname, optval, optlen);
|
||||||
int socketio_connect(struct w32_io* pio, const struct sockaddr* name, int namelen);
|
}
|
||||||
int socketio_shutdown(struct w32_io* pio, int how);
|
|
||||||
|
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);
|
||||||
|
}
|
@ -11,6 +11,7 @@ struct w32fd_table fd_table;
|
|||||||
int fd_table_initialize() {
|
int fd_table_initialize() {
|
||||||
memset(&fd_table, 0, sizeof(fd_table));
|
memset(&fd_table, 0, sizeof(fd_table));
|
||||||
//set stdin, stdout and stderr
|
//set stdin, stdout and stderr
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fd_table_get_min_index() {
|
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)
|
void fd_table_clear(int index)
|
||||||
{
|
{
|
||||||
|
struct w32_pio* pio = fd_table.w32fds[index];
|
||||||
|
//pio->table_index = -1;
|
||||||
fd_table.w32fds[index] = NULL;
|
fd_table.w32fds[index] = NULL;
|
||||||
FD_SET(index, &(fd_table.occupied));
|
FD_SET(index, &(fd_table.occupied));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void w32posix_initialize() {
|
||||||
|
socketio_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
BOOL w32_io_is_blocking(struct w32_io* pio)
|
BOOL w32_io_is_blocking(struct w32_io* pio)
|
||||||
{
|
{
|
||||||
return (pio->fd_status_flags & O_NONBLOCK) ? TRUE : FALSE;
|
return (pio->fd_status_flags & O_NONBLOCK) ? TRUE : FALSE;
|
||||||
@ -67,9 +74,7 @@ int w32_socket(int domain, int type, int protocol) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pio->type = SOCK_FD;
|
|
||||||
fd_table_set(pio, min_index);
|
fd_table_set(pio, min_index);
|
||||||
|
|
||||||
return 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);
|
fd_table_set(pio, min_index);
|
||||||
|
return min_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
int w32_setsockopt(int fd, int level, int optname, const char* optval, int optlen) {
|
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) {
|
int w32_close(int fd) {
|
||||||
struct w32_io* pio = fd_table.w32fds[fd];
|
struct w32_io* pio = fd_table.w32fds[fd];
|
||||||
|
|
||||||
|
fd_table_clear(pio->table_index);
|
||||||
if ((pio->type == LISTEN_FD) || (pio->type == SOCK_FD)) {
|
if ((pio->type == LISTEN_FD) || (pio->type == SOCK_FD)) {
|
||||||
socketio_close(pio);
|
socketio_close(pio);
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ int fd_table_initialize();
|
|||||||
int fd_table_add(struct w32_io*);
|
int fd_table_add(struct w32_io*);
|
||||||
int fd_table_delete(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_socket(int domain, int type, int protocol);
|
||||||
|
|
||||||
struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* addrlen);
|
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_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_getsockopt(struct w32_io* pio, int level, int optname, char* optval, int* optlen);
|
||||||
|
@ -36,15 +36,20 @@ typedef struct w32_fd_set_ {
|
|||||||
|
|
||||||
#define socket w32_socket
|
#define socket w32_socket
|
||||||
|
|
||||||
/*w32 prototypes of posix functions*/
|
void w32posix_initialize();
|
||||||
FILE* w32_fdopen(int fd, const char *mode);
|
|
||||||
int w32_fstat(int fd, struct stat *buf);
|
|
||||||
int w32_isatty(int fd);
|
|
||||||
|
|
||||||
|
|
||||||
/*network i/o*/
|
/*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_socket(int domain, int type, int protocol);
|
||||||
|
|
||||||
int w32_accept(int fd, struct sockaddr* addr, int* addrlen);
|
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_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);
|
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);
|
int w32_shutdown(int fd, int how);
|
||||||
|
|
||||||
/*non-network i/o*/
|
/*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_pipe(int *pfds);
|
||||||
int w32_open(const char *pathname, int flags, ...);
|
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_creat(const char *pathname, int mode);
|
||||||
int w32_read(int fd, void *dst, unsigned int max);
|
int w32_read(int fd, void *dst, unsigned int max);
|
||||||
int w32_write(int fd, const void *buf, 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*/
|
/*common i/o*/
|
||||||
int w32_ioctl(int d, int request, ...);
|
#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_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_fcntl(int fd, int cmd, ... /* arg */);
|
||||||
int w32_dup(int oldfd);
|
int w32_dup(int oldfd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user