Example #1
0
void
CArchNetworkWinsock::initModule(HMODULE module)
{
	if (module == NULL) {
		throw XArchNetworkSupport("");
	}

	// get startup function address
	int (PASCAL FAR *startup)(WORD, LPWSADATA);
	setfunc(startup, WSAStartup, int(PASCAL FAR*)(WORD, LPWSADATA));

	// startup network library
	WORD version = MAKEWORD(2 /*major*/, 0 /*minor*/);
	WSADATA data;
	int err = startup(version, &data);
	if (data.wVersion != version) {
		throw XArchNetworkSupport(new XArchEvalWinsock(err));
	}
	if (err != 0) {
		// some other initialization error
		throwError(err);
	}

	// get function addresses
	setfunc(accept_winsock, accept, SOCKET (PASCAL FAR *)(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen));
	setfunc(bind_winsock, bind, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *addr, int namelen));
	setfunc(close_winsock, closesocket, int (PASCAL FAR *)(SOCKET s));
	setfunc(connect_winsock, connect, int (PASCAL FAR *)(SOCKET s, const struct sockaddr FAR *name, int namelen));
	setfunc(gethostname_winsock, gethostname, int (PASCAL FAR *)(char FAR * name, int namelen));
	setfunc(getsockerror_winsock, WSAGetLastError, int (PASCAL FAR *)(void));
	setfunc(getsockopt_winsock, getsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, void FAR * optval, int FAR *optlen));
	setfunc(htons_winsock, htons, u_short (PASCAL FAR *)(u_short v));
	setfunc(inet_ntoa_winsock, inet_ntoa, char FAR * (PASCAL FAR *)(struct in_addr in));
	setfunc(inet_addr_winsock, inet_addr, unsigned long (PASCAL FAR *)(const char FAR * cp));
	setfunc(ioctl_winsock, ioctlsocket, int (PASCAL FAR *)(SOCKET s, int cmd, void FAR *));
	setfunc(listen_winsock, listen, int (PASCAL FAR *)(SOCKET s, int backlog));
	setfunc(ntohs_winsock, ntohs, u_short (PASCAL FAR *)(u_short v));
	setfunc(recv_winsock, recv, int (PASCAL FAR *)(SOCKET s, void FAR * buf, int len, int flags));
	setfunc(select_winsock, select, int (PASCAL FAR *)(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, const struct timeval FAR *timeout));
	setfunc(send_winsock, send, int (PASCAL FAR *)(SOCKET s, const void FAR * buf, int len, int flags));
	setfunc(setsockopt_winsock, setsockopt, int (PASCAL FAR *)(SOCKET s, int level, int optname, const void FAR * optval, int optlen));
	setfunc(shutdown_winsock, shutdown, int (PASCAL FAR *)(SOCKET s, int how));
	setfunc(socket_winsock, socket, SOCKET (PASCAL FAR *)(int af, int type, int protocol));
	setfunc(gethostbyaddr_winsock, gethostbyaddr, struct hostent FAR * (PASCAL FAR *)(const char FAR * addr, int len, int type));
	setfunc(gethostbyname_winsock, gethostbyname, struct hostent FAR * (PASCAL FAR *)(const char FAR * name));
	setfunc(WSACleanup_winsock, WSACleanup, int (PASCAL FAR *)(void));
	setfunc(WSAFDIsSet_winsock, __WSAFDIsSet, int (PASCAL FAR *)(SOCKET, fd_set FAR *));
	setfunc(WSACreateEvent_winsock, WSACreateEvent, WSAEVENT (PASCAL FAR *)(void));
	setfunc(WSACloseEvent_winsock, WSACloseEvent, BOOL (PASCAL FAR *)(WSAEVENT));
	setfunc(WSASetEvent_winsock, WSASetEvent, BOOL (PASCAL FAR *)(WSAEVENT));
	setfunc(WSAResetEvent_winsock, WSAResetEvent, BOOL (PASCAL FAR *)(WSAEVENT));
	setfunc(WSAEventSelect_winsock, WSAEventSelect, int (PASCAL FAR *)(SOCKET, WSAEVENT, long));
	setfunc(WSAWaitForMultipleEvents_winsock, WSAWaitForMultipleEvents, DWORD (PASCAL FAR *)(DWORD, const WSAEVENT FAR*, BOOL, DWORD, BOOL));
	setfunc(WSAEnumNetworkEvents_winsock, WSAEnumNetworkEvents, int (PASCAL FAR *)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS));

	s_networkModule = module;
}
Example #2
0
static
FARPROC
netGetProcAddress(HMODULE module, LPCSTR name)
{
	FARPROC func = ::GetProcAddress(module, name);
	if (!func) {
		throw XArchNetworkSupport("");
	}
	return func;
}
CArchNetworkWinsock::CArchNetworkWinsock()
{
	static const char* s_library[] = { "ws2_32.dll" };

	assert(WSACleanup_winsock == NULL);
	assert(s_networkModule    == NULL);

	// try each winsock library
	for (size_t i = 0; i < sizeof(s_library) / sizeof(s_library[0]); ++i) {
		try {
			init((HMODULE)::LoadLibrary(s_library[i]));
			m_mutex = ARCH->newMutex();
			return;
		}
		catch (XArchNetwork&) {
			// ignore
		}
	}

	// can't initialize any library
	throw XArchNetworkSupport("Cannot load winsock library");
}
void
CArchNetworkBSD::throwError(int err)
{
	switch (err) {
	case EINTR:
		ARCH->testCancelThread();
		throw XArchNetworkInterrupted(new XArchEvalUnix(err));

	case EACCES:
	case EPERM:
		throw XArchNetworkAccess(new XArchEvalUnix(err));

	case ENFILE:
	case EMFILE:
	case ENODEV:
	case ENOBUFS:
	case ENOMEM:
	case ENETDOWN:
#if defined(ENOSR)
	case ENOSR:
#endif
		throw XArchNetworkResource(new XArchEvalUnix(err));

	case EPROTOTYPE:
	case EPROTONOSUPPORT:
	case EAFNOSUPPORT:
	case EPFNOSUPPORT:
	case ESOCKTNOSUPPORT:
	case EINVAL:
	case ENOPROTOOPT:
	case EOPNOTSUPP:
	case ESHUTDOWN:
#if defined(ENOPKG)
	case ENOPKG:
#endif
		throw XArchNetworkSupport(new XArchEvalUnix(err));

	case EIO:
		throw XArchNetworkIO(new XArchEvalUnix(err));

	case EADDRNOTAVAIL:
		throw XArchNetworkNoAddress(new XArchEvalUnix(err));

	case EADDRINUSE:
		throw XArchNetworkAddressInUse(new XArchEvalUnix(err));

	case EHOSTUNREACH:
	case ENETUNREACH:
		throw XArchNetworkNoRoute(new XArchEvalUnix(err));

	case ENOTCONN:
		throw XArchNetworkNotConnected(new XArchEvalUnix(err));

	case EPIPE:
		throw XArchNetworkShutdown(new XArchEvalUnix(err));

	case ECONNABORTED:
	case ECONNRESET:
		throw XArchNetworkDisconnected(new XArchEvalUnix(err));

	case ECONNREFUSED:
		throw XArchNetworkConnectionRefused(new XArchEvalUnix(err));

	case EHOSTDOWN:
	case ETIMEDOUT:
		throw XArchNetworkTimedOut(new XArchEvalUnix(err));

	default:
		throw XArchNetwork(new XArchEvalUnix(err));
	}
}