X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/8ce72d2c1c7651def2425be607ef623e6b0b9bd2..fe50e8140a2dbb3ba357a0ab777f34e07d568c23:/raw.c diff --git a/raw.c b/raw.c index 05e453aa..3f82d7ad 100644 --- a/raw.c +++ b/raw.c @@ -1,7 +1,13 @@ #include #include #include +#ifndef AUTO_WINSOCK +#ifdef WINSOCK_TWO +#include +#else #include +#endif +#endif #include "putty.h" @@ -14,8 +20,6 @@ static SOCKET s = INVALID_SOCKET; -#define iswritable(x) ( (x) != IAC && (x) != CR ) - static void raw_size(void); static int sb_opt, sb_len; @@ -50,14 +54,7 @@ static void s_write (void *buf, int len) { } static void c_write (char *buf, int len) { - while (len--) { - int new_head = (inbuf_head + 1) & INBUF_MASK; - int c = (unsigned char) *buf; - if (new_head != inbuf_reap) { - inbuf[inbuf_head] = *buf++; - inbuf_head = new_head; - } - } + from_backend(0, buf, len); } /* @@ -132,13 +129,18 @@ static char *raw_init (HWND hwnd, char *host, int port, char **realhost) { default: return "connect(): unknown error"; } - if (WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | + if (hwnd && WSAAsyncSelect (s, hwnd, WM_NETEVENT, FD_READ | FD_WRITE | FD_OOB | FD_CLOSE) == SOCKET_ERROR) switch (WSAGetLastError()) { case WSAENETDOWN: return "Network is down"; default: return "WSAAsyncSelect(): unknown error"; } + /* + * We have no pre-session phase. + */ + begin_session(); + return NULL; } @@ -157,8 +159,11 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) { * the queue; so it's possible that we can get here even with s * invalid. If so, we return 1 and don't worry about it. */ - if (s == INVALID_SOCKET) + if (s == INVALID_SOCKET) { + closesocket(s); + s = INVALID_SOCKET; return 1; + } if (WSAGETSELECTERROR(lParam) != 0) return -WSAGETSELECTERROR(lParam); @@ -169,8 +174,11 @@ static int raw_msg (WPARAM wParam, LPARAM lParam) { ret = recv(s, buf, sizeof(buf), 0); if (ret < 0 && WSAGetLastError() == WSAEWOULDBLOCK) return 1; - if (ret < 0) /* any _other_ error */ + if (ret < 0) { /* any _other_ error */ + closesocket(s); + s = INVALID_SOCKET; return -10000-WSAGetLastError(); + } if (ret == 0) { s = INVALID_SOCKET; return 0; @@ -223,10 +231,17 @@ static void raw_special (Telnet_Special code) { return; } +static SOCKET raw_socket(void) { return s; } + +static int raw_sendok(void) { return 1; } + Backend raw_backend = { raw_init, raw_msg, raw_send, raw_size, - raw_special + raw_special, + raw_socket, + raw_sendok, + 1 };