mirror of
https://github.com/PowerShell/Win32-OpenSSH.git
synced 2025-07-25 06:55:15 +02:00
2-27 C1
This commit is contained in:
parent
9fe3ef60e6
commit
d42ef60f9c
@ -147,9 +147,6 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
|
@ -14,9 +14,6 @@
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="stdafx.h">
|
||||
<Filter>Header Files</Filter>
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
|
||||
#define debug(cformat, ...) write_log(__FILE__, __FUNCTION__, __LINE__, cformat, __VA_ARGS__)
|
||||
#define debug2(cformat, ...) write_log(__FILE__, __FUNCTION__, __LINE__, cformat, __VA_ARGS__)
|
||||
|
||||
void debug_initialize();
|
||||
void debug_done();
|
||||
|
@ -233,7 +233,7 @@ VOID CALLBACK ReadCompletionRoutine(
|
||||
_Inout_ LPOVERLAPPED lpOverlapped
|
||||
) {
|
||||
struct w32_io* pio = (struct w32_io*)((char*)lpOverlapped - offsetof(struct w32_io, read_overlapped));
|
||||
debug("pio:%p, pending_state:%d, error:%d, transferred:%d", pio, pio->read_details.pending, dwErrorCode, dwNumberOfBytesTransfered);
|
||||
debug2("pio:%p, pending_state:%d, error:%d, transferred:%d", pio, pio->read_details.pending, dwErrorCode, dwNumberOfBytesTransfered);
|
||||
pio->read_details.error = dwErrorCode;
|
||||
pio->read_details.remaining = dwNumberOfBytesTransfered;
|
||||
pio->read_details.completed = 0;
|
||||
@ -276,7 +276,7 @@ int fileio_read(struct w32_io* pio, void *dst, unsigned int max) {
|
||||
//if read is pending
|
||||
if (pio->read_details.pending) {
|
||||
errno = EAGAIN;
|
||||
debug("IO is already pending");
|
||||
debug2("IO is already pending");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -285,7 +285,7 @@ int fileio_read(struct w32_io* pio, void *dst, unsigned int max) {
|
||||
|
||||
if (-1 == fileio_ReadFileEx(pio)) {
|
||||
if ((pio->type == PIPE_FD) && (errno == ERROR_NEGATIVE_SEEK)) {//write end of the pipe closed
|
||||
debug("no more data");
|
||||
debug2("no more data");
|
||||
errno = 0;
|
||||
return 0;
|
||||
}
|
||||
@ -303,7 +303,7 @@ int fileio_read(struct w32_io* pio, void *dst, unsigned int max) {
|
||||
}
|
||||
else if (pio->read_details.pending) {
|
||||
errno = EAGAIN;
|
||||
debug("IO is pending");
|
||||
debug2("IO is pending");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -312,7 +312,7 @@ int fileio_read(struct w32_io* pio, void *dst, unsigned int max) {
|
||||
errno = errno_from_Win32Error(pio->read_details.error);
|
||||
if ((errno == ERROR_BROKEN_PIPE) || //write end of the pipe is closed or pipe broken
|
||||
(errno == ERROR_HANDLE_EOF)) { //end of file reached
|
||||
debug("no more data");
|
||||
debug2("no more data");
|
||||
errno = 0;
|
||||
pio->read_details.error = 0;
|
||||
return 0;
|
||||
@ -326,7 +326,7 @@ int fileio_read(struct w32_io* pio, void *dst, unsigned int max) {
|
||||
memcpy(dst, pio->read_details.buf + pio->read_details.completed, bytes_copied);
|
||||
pio->read_details.remaining -= bytes_copied;
|
||||
pio->read_details.completed += bytes_copied;
|
||||
debug("read %d bytes", bytes_copied);
|
||||
debug2("read %d bytes", bytes_copied);
|
||||
return bytes_copied;
|
||||
}
|
||||
|
||||
@ -336,7 +336,7 @@ VOID CALLBACK WriteCompletionRoutine(
|
||||
_Inout_ LPOVERLAPPED lpOverlapped
|
||||
) {
|
||||
struct w32_io* pio = (struct w32_io*)((char*)lpOverlapped - offsetof(struct w32_io, write_overlapped));
|
||||
debug("pio:%p, pending_state:%d, remaining:%d, error:%d, transferred:%d", pio, pio->write_details.pending, pio->write_details.remaining, dwErrorCode, dwNumberOfBytesTransfered);
|
||||
debug2("pio:%p, pending_state:%d, remaining:%d, error:%d, transferred:%d", pio, pio->write_details.pending, pio->write_details.remaining, dwErrorCode, dwNumberOfBytesTransfered);
|
||||
pio->write_details.error = dwErrorCode;
|
||||
//assert that remaining == dwNumberOfBytesTransfered
|
||||
pio->write_details.remaining -= dwNumberOfBytesTransfered;
|
||||
@ -352,7 +352,7 @@ int fileio_write(struct w32_io* pio, const void *buf, unsigned int max) {
|
||||
{
|
||||
//this covers the scenario when the fd was previously non blocking (and hence io is still pending)
|
||||
//wait for previous io to complete
|
||||
debug("waiting for prior unblocking write to complete before proceeding with this blocking write");
|
||||
debug2("waiting for prior unblocking write to complete before proceeding with this blocking write");
|
||||
while (pio->write_details.pending) {
|
||||
if (wait_for_any_event(NULL, 0, INFINITE) == -1)
|
||||
return -1;
|
||||
@ -360,7 +360,7 @@ int fileio_write(struct w32_io* pio, const void *buf, unsigned int max) {
|
||||
}
|
||||
else {
|
||||
errno = EAGAIN;
|
||||
debug("IO is already pending");
|
||||
debug2("IO is already pending");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -420,7 +420,7 @@ int fileio_write(struct w32_io* pio, const void *buf, unsigned int max) {
|
||||
|
||||
int fileio_fstat(struct w32_io* pio, struct stat *buf) {
|
||||
int fd = _open_osfhandle((intptr_t)pio->handle, 0);
|
||||
debug("pio:%p", pio);
|
||||
debug2("pio:%p", pio);
|
||||
if (fd == -1) {
|
||||
errno = EOTHER;
|
||||
return -1;
|
||||
@ -438,7 +438,7 @@ int fileio_isatty(struct w32_io* pio) {
|
||||
FILE* fileio_fdopen(struct w32_io* pio, const char *mode) {
|
||||
|
||||
int fd_flags = 0;
|
||||
debug("pio:%p", pio);
|
||||
debug2("pio:%p", pio);
|
||||
|
||||
if (mode[1] == '\0') {
|
||||
switch (*mode) {
|
||||
@ -489,7 +489,7 @@ int fileio_on_select(struct w32_io* pio, BOOL rd) {
|
||||
|
||||
|
||||
int fileio_close(struct w32_io* pio) {
|
||||
debug("pio:%p", pio);
|
||||
debug2("pio:%p", pio);
|
||||
CancelIo(pio->handle);
|
||||
//let queued APCs (if any) drain
|
||||
SleepEx(0, TRUE);
|
||||
|
@ -133,7 +133,7 @@ void CALLBACK WSARecvCompletionRoutine(
|
||||
)
|
||||
{
|
||||
struct w32_io* pio = (struct w32_io*)((char*)lpOverlapped - offsetof(struct w32_io, read_overlapped));
|
||||
debug("pio:%p, pending_state:%d, remaining:%d, completed:%d, error:%d, transferred: %d",
|
||||
debug2("pio:%p, pending_state:%d, remaining:%d, completed:%d, error:%d, transferred: %d",
|
||||
pio, pio->read_details.pending, pio->read_details.remaining, pio->read_details.pending, dwError, cbTransferred);
|
||||
if (!dwError && !cbTransferred)
|
||||
dwError = ERROR_GRACEFUL_DISCONNECT;
|
||||
@ -176,7 +176,7 @@ int socketio_WSARecv(struct w32_io* pio, BOOL* completed) {
|
||||
{
|
||||
pio->read_details.pending = TRUE;
|
||||
//receive has completed but APC is pending to be scheduled
|
||||
debug("WSARecv immediate completion");
|
||||
debug2("WSARecv immediate completion");
|
||||
if (completed)
|
||||
*completed = TRUE;
|
||||
}
|
||||
@ -258,7 +258,7 @@ int socketio_connect(struct w32_io* pio, const struct sockaddr* name, int namele
|
||||
int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
BOOL completed = FALSE;
|
||||
|
||||
debug("pio: %p", pio);
|
||||
debug2("pio: %p", pio);
|
||||
|
||||
if ((buf == NULL) || (len == 0)){
|
||||
errno = EINVAL;
|
||||
@ -275,7 +275,7 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
//if io is already pending
|
||||
if (pio->read_details.pending) {
|
||||
errno = EAGAIN;
|
||||
debug("Read is already pending");
|
||||
debug2("Read is already pending");
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -286,14 +286,14 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
memcpy(buf, pio->read_details.buf + pio->read_details.completed, num_bytes_copied);
|
||||
pio->read_details.remaining -= num_bytes_copied;
|
||||
pio->read_details.completed += num_bytes_copied;
|
||||
debug("returning %d bytes from prior completed IO, remaining: %d", num_bytes_copied, pio->read_details.remaining);
|
||||
debug2("returning %d bytes from prior completed IO, remaining: %d", num_bytes_copied, pio->read_details.remaining);
|
||||
return num_bytes_copied;
|
||||
}
|
||||
|
||||
//if there was an error on async call, return
|
||||
if (pio->read_details.error) {
|
||||
if (pio->read_details.error == ERROR_GRACEFUL_DISCONNECT) {
|
||||
debug("connection closed");
|
||||
debug2("connection closed");
|
||||
//connection is closed
|
||||
return 0;
|
||||
}
|
||||
@ -330,7 +330,7 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
else {
|
||||
if (socketio_is_io_available(pio, TRUE) == FALSE) {
|
||||
errno = EAGAIN;
|
||||
debug("IO is pending");
|
||||
debug2("IO is pending");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -340,7 +340,7 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
{
|
||||
if (pio->read_details.error == ERROR_GRACEFUL_DISCONNECT) {
|
||||
//connection is closed
|
||||
debug("connection closed");
|
||||
debug2("connection closed");
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
@ -356,7 +356,7 @@ int socketio_recv(struct w32_io* pio, void *buf, size_t len, int flags) {
|
||||
memcpy(buf, pio->read_details.buf, num_bytes_copied);
|
||||
pio->read_details.remaining -= num_bytes_copied;
|
||||
pio->read_details.completed = num_bytes_copied;
|
||||
debug("returning %d bytes from completed IO, remaining: %d", num_bytes_copied, pio->read_details.remaining);
|
||||
debug2("returning %d bytes from completed IO, remaining: %d", num_bytes_copied, pio->read_details.remaining);
|
||||
return num_bytes_copied;
|
||||
}
|
||||
else {
|
||||
@ -376,7 +376,7 @@ void CALLBACK WSASendCompletionRoutine(
|
||||
)
|
||||
{
|
||||
struct w32_io* pio = (struct w32_io*)((char*)lpOverlapped - offsetof(struct w32_io, write_overlapped));
|
||||
debug("pio: %p, pending_state:%d, error:%d, transferred:%d, remaining: %d", pio, pio->write_details.pending, dwError, cbTransferred, pio->write_details.remaining);
|
||||
debug2("pio: %p, pending_state:%d, error:%d, transferred:%d, remaining: %d", pio, pio->write_details.pending, dwError, cbTransferred, pio->write_details.remaining);
|
||||
pio->write_details.error = dwError;
|
||||
//assert that remaining == cbTransferred
|
||||
pio->write_details.remaining -= cbTransferred;
|
||||
@ -387,7 +387,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) {
|
||||
int ret = 0;
|
||||
WSABUF wsabuf;
|
||||
|
||||
debug("pio: %p", pio);
|
||||
debug2("pio: %p", pio);
|
||||
|
||||
if ((buf == NULL) || (len == 0)){
|
||||
errno = EINVAL;
|
||||
@ -408,7 +408,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) {
|
||||
{
|
||||
//this covers the scenario when the fd was previously non blocking (and hence io is still pending)
|
||||
//wait for previous io to complete
|
||||
debug("waiting for IO on a previous nonblocking send to complete");
|
||||
debug2("waiting for IO on a previous nonblocking send to complete");
|
||||
while (pio->write_details.pending) {
|
||||
if (wait_for_any_event(NULL, 0, INFINITE) == -1)
|
||||
return -1;
|
||||
@ -416,7 +416,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) {
|
||||
}
|
||||
else {
|
||||
errno = EAGAIN;
|
||||
debug("IO pending");
|
||||
debug2("IO pending");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -456,7 +456,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) {
|
||||
if (ret == 0)
|
||||
{
|
||||
//send has completed and APC is scheduled, let it run
|
||||
debug("WSASend immediate completion");
|
||||
debug2("WSASend immediate completion");
|
||||
pio->write_details.pending = TRUE;
|
||||
pio->write_details.remaining = wsabuf.len;
|
||||
SleepEx(1, TRUE);
|
||||
@ -473,7 +473,7 @@ int socketio_send(struct w32_io* pio, const void *buf, size_t len, int flags) {
|
||||
if (WSAGetLastError() == WSA_IO_PENDING)
|
||||
{
|
||||
//io is initiated and pending
|
||||
debug("IO pending");
|
||||
debug2("IO pending");
|
||||
pio->write_details.pending = TRUE;
|
||||
pio->write_details.remaining = wsabuf.len;
|
||||
if (w32_io_is_blocking(pio))
|
||||
@ -500,12 +500,12 @@ int socketio_shutdown(struct w32_io* pio, int how) {
|
||||
}
|
||||
|
||||
int socketio_close(struct w32_io* pio) {
|
||||
debug("pio: %p", pio);
|
||||
debug2("pio: %p", pio);
|
||||
closesocket(pio->sock);
|
||||
//wait for pending io to abort
|
||||
SleepEx(0, TRUE);
|
||||
if (pio->read_details.pending || pio->write_details.pending)
|
||||
debug("IO is still pending on closed socket. read:%d, write:%d", pio->read_details.pending, pio->write_details.pending);
|
||||
debug2("IO is still pending on closed socket. read:%d, write:%d", pio->read_details.pending, pio->write_details.pending);
|
||||
if (pio->type == LISTEN_FD) {
|
||||
if (pio->read_overlapped.hEvent)
|
||||
CloseHandle(pio->read_overlapped.hEvent);
|
||||
@ -529,7 +529,7 @@ struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* a
|
||||
int iResult = 0;
|
||||
struct acceptEx_context* context = (struct acceptEx_context*)pio->context;
|
||||
|
||||
debug("pio:%p", pio);
|
||||
debug2("pio:%p", pio);
|
||||
//start io if not already started
|
||||
if (pio->read_details.pending == FALSE) {
|
||||
if (socketio_acceptEx(pio) != 0) {
|
||||
@ -551,7 +551,7 @@ struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* a
|
||||
//if i/o is not ready
|
||||
if (FALSE == socketio_is_io_available(pio, TRUE)) {
|
||||
errno = EAGAIN;
|
||||
debug("accept is pending");
|
||||
debug2("accept is pending");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -578,7 +578,7 @@ struct w32_io* socketio_accept(struct w32_io* pio, struct sockaddr* addr, int* a
|
||||
context->accept_socket = INVALID_SOCKET;
|
||||
pio->read_details.pending = FALSE;
|
||||
ResetEvent(pio->read_overlapped.hEvent);
|
||||
debug("accept io:%p", accept_io);
|
||||
debug2("accept io:%p", accept_io);
|
||||
return accept_io;
|
||||
}
|
||||
|
||||
@ -613,7 +613,7 @@ BOOL socketio_is_io_available(struct w32_io* pio, BOOL rd) {
|
||||
|
||||
int socketio_on_select(struct w32_io* pio, BOOL rd) {
|
||||
|
||||
debug("pio:%p", pio);
|
||||
debug2("pio:%p", pio);
|
||||
if (rd && pio->read_details.pending)
|
||||
return 0;
|
||||
|
||||
|
@ -392,7 +392,7 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co
|
||||
*readfds = read_ready_fds;
|
||||
if (writefds)
|
||||
*writefds = write_ready_fds;
|
||||
debug("IO ready:%d, no wait", out_ready_fds);
|
||||
debug2("IO ready:%d, no wait", out_ready_fds);
|
||||
return out_ready_fds;
|
||||
}
|
||||
|
||||
@ -450,7 +450,7 @@ int w32_select(int fds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, co
|
||||
if (out_ready_fds)
|
||||
break;
|
||||
|
||||
debug("wait ended without any IO completion, looping again");
|
||||
debug2("wait ended without any IO completion, looping again");
|
||||
|
||||
} while (1);
|
||||
|
||||
|
@ -135,9 +135,6 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="debug.c" />
|
||||
<ClCompile Include="fileio.c" />
|
||||
|
@ -14,9 +14,6 @@
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Text Include="ReadMe.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="socketio.c">
|
||||
<Filter>Source Files</Filter>
|
||||
|
Loading…
x
Reference in New Issue
Block a user