1
0
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:
Simon Tatham
2003-10-12 13:46:12 +00:00
parent 8e2fd15bd5
commit e30aed9a6f
21 changed files with 230 additions and 230 deletions

40
plink.c
View File

@ -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 */
}