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; }
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)); } }