mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-13 00:57:33 -05:00
The WinSock library is now loaded at run-time, which means we can
attempt to load WS2 and then fall back to WS1 if that fails. This should allow us to use WS2-specific functionality to find out the local system's list of IP addresses, thus fixing winnet-if2lo, while degrading gracefully back to the previous behaviour if that functionality is unavailable. (I haven't yet actually done this; I've just laid the groundwork.) This checkin _may_ cause instability; it seemed fine to me on initial testing, but it's a bit of an upheaval and I wouldn't like to make bets on it just yet. [originally from svn r3502]
This commit is contained in:
40
plink.c
40
plink.c
@ -2,10 +2,6 @@
|
||||
* PLink - a command-line (stdin/stdout) variant of PuTTY.
|
||||
*/
|
||||
|
||||
#ifndef AUTO_WINSOCK
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
@ -35,7 +31,6 @@ void fatalbox(char *p, ...)
|
||||
vfprintf(stderr, p, ap);
|
||||
va_end(ap);
|
||||
fputc('\n', stderr);
|
||||
WSACleanup();
|
||||
cleanup_exit(1);
|
||||
}
|
||||
void modalfatalbox(char *p, ...)
|
||||
@ -46,7 +41,6 @@ void modalfatalbox(char *p, ...)
|
||||
vfprintf(stderr, p, ap);
|
||||
va_end(ap);
|
||||
fputc('\n', stderr);
|
||||
WSACleanup();
|
||||
cleanup_exit(1);
|
||||
}
|
||||
void connection_fatal(void *frontend, char *p, ...)
|
||||
@ -57,7 +51,6 @@ void connection_fatal(void *frontend, char *p, ...)
|
||||
vfprintf(stderr, p, ap);
|
||||
va_end(ap);
|
||||
fputc('\n', stderr);
|
||||
WSACleanup();
|
||||
cleanup_exit(1);
|
||||
}
|
||||
void cmdline_error(char *p, ...)
|
||||
@ -251,12 +244,12 @@ char *do_select(SOCKET skt, int startup)
|
||||
} else {
|
||||
events = 0;
|
||||
}
|
||||
if (WSAEventSelect(skt, netevent, events) == SOCKET_ERROR) {
|
||||
switch (WSAGetLastError()) {
|
||||
if (p_WSAEventSelect(skt, netevent, events) == SOCKET_ERROR) {
|
||||
switch (p_WSAGetLastError()) {
|
||||
case WSAENETDOWN:
|
||||
return "Network is down";
|
||||
default:
|
||||
return "WSAAsyncSelect(): unknown error";
|
||||
return "WSAEventSelect(): unknown error";
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
@ -264,8 +257,6 @@ char *do_select(SOCKET skt, int startup)
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
WSADATA wsadata;
|
||||
WORD winsock_ver;
|
||||
WSAEVENT stdinevent, stdoutevent, stderrevent;
|
||||
HANDLE handles[4];
|
||||
DWORD in_threadid, out_threadid, err_threadid;
|
||||
@ -545,22 +536,11 @@ int main(int argc, char **argv)
|
||||
if (portnumber != -1)
|
||||
cfg.port = portnumber;
|
||||
|
||||
/*
|
||||
* Initialise WinSock.
|
||||
*/
|
||||
winsock_ver = MAKEWORD(2, 0);
|
||||
if (WSAStartup(winsock_ver, &wsadata)) {
|
||||
MessageBox(NULL, "Unable to initialise WinSock", "WinSock Error",
|
||||
MB_OK | MB_ICONEXCLAMATION);
|
||||
return 1;
|
||||
}
|
||||
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 0) {
|
||||
MessageBox(NULL, "WinSock version is incompatible with 2.0",
|
||||
"WinSock Error", MB_OK | MB_ICONEXCLAMATION);
|
||||
WSACleanup();
|
||||
return 1;
|
||||
}
|
||||
sk_init();
|
||||
if (p_WSAEventSelect == NULL) {
|
||||
fprintf(stderr, "Plink requires WinSock 2\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Start up the connection.
|
||||
@ -702,7 +682,7 @@ int main(int argc, char **argv)
|
||||
WPARAM wp;
|
||||
socket = sklist[i];
|
||||
wp = (WPARAM) socket;
|
||||
if (!WSAEnumNetworkEvents(socket, NULL, &things)) {
|
||||
if (!p_WSAEnumNetworkEvents(socket, NULL, &things)) {
|
||||
static const struct { int bit, mask; } eventtypes[] = {
|
||||
{FD_CONNECT_BIT, FD_CONNECT},
|
||||
{FD_READ_BIT, FD_READ},
|
||||
@ -780,11 +760,11 @@ int main(int argc, char **argv)
|
||||
bufchain_size(&stderr_data) == 0)
|
||||
break; /* we closed the connection */
|
||||
}
|
||||
WSACleanup();
|
||||
exitcode = back->exitcode(backhandle);
|
||||
if (exitcode < 0) {
|
||||
fprintf(stderr, "Remote process exit code unavailable\n");
|
||||
exitcode = 1; /* this is an error condition */
|
||||
}
|
||||
return exitcode;
|
||||
cleanup_exit(exitcode);
|
||||
return 0; /* placate compiler warning */
|
||||
}
|
||||
|
Reference in New Issue
Block a user