PageRenderTime 25ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/turing/src/mdionet.c

https://bitbucket.org/yingted/openturing
C | 988 lines | 641 code | 150 blank | 197 comment | 125 complexity | 5809f3f7ac1565603d404898780e7923 MD5 | raw file
  1. /*************/
  2. /* mdionet.c */
  3. /*************/
  4. /*******************/
  5. /* System includes */
  6. /*******************/
  7. #include <winsock2.h>
  8. #include <wininet.h>
  9. /****************/
  10. /* Self include */
  11. /****************/
  12. #include "mdionet.h"
  13. /******************/
  14. /* Other includes */
  15. /******************/
  16. #include "mionet.h"
  17. #include "mio.h"
  18. #include "mioerr.h"
  19. #include "edint.h"
  20. #include "mdio.h"
  21. /**********/
  22. /* Macros */
  23. /**********/
  24. /*************/
  25. /* Constants */
  26. /*************/
  27. #ifndef SD_SEND
  28. #define SD_SEND 0x01
  29. #endif
  30. /********************/
  31. /* Global variables */
  32. /********************/
  33. /*********/
  34. /* Types */
  35. /*********/
  36. typedef int (_stdcall *WSAStartupProc) (WORD wVersionRequested,
  37. LPWSADATA lpWSAData);
  38. typedef int (_stdcall *WSACleanupProc) (void);
  39. typedef int (_stdcall *WSAGetLastErrorProc) (void);
  40. typedef SOCKET (_stdcall *acceptProc) (SOCKET s, struct sockaddr FAR *addr,
  41. int FAR *addrlen);
  42. typedef int (_stdcall *bindProc) (SOCKET s,
  43. const struct sockaddr FAR *name,
  44. int namelen);
  45. typedef int (_stdcall *closesocketProc) (SOCKET s);
  46. typedef int (_stdcall *connectProc) (SOCKET s, const struct sockaddr FAR *name,
  47. int namelen);
  48. typedef struct hostent FAR * (_stdcall *gethostbyaddrProc) (
  49. const char FAR *name,
  50. int len, int type);
  51. typedef struct hostent FAR * (_stdcall *gethostbynameProc) (
  52. const char FAR *name);
  53. typedef int (_stdcall *gethostnameProc) (const char FAR *name, int namelen);
  54. typedef u_short (_stdcall *htonsProc) (u_short hostshort);
  55. typedef unsigned long (_stdcall *inet_addrProc) (const char FAR *cp);
  56. typedef char FAR * (_stdcall *inet_ntoaProc) (struct in_addr in);
  57. typedef int (_stdcall *ioctlsocketProc) (SOCKET s, long cmd, u_long FAR *argp);
  58. typedef int (_stdcall *listenProc) (SOCKET s, int backlog);
  59. typedef int (_stdcall *recvProc) (SOCKET s, char FAR *buf, int len, int flags);
  60. typedef int (_stdcall *selectProc) (int nfds, fd_set FAR *readfds,
  61. fd_set FAR *writefds,
  62. fd_set FAR *exceptfds,
  63. const struct timeval FAR *timeout);
  64. typedef int (_stdcall *sendProc) (SOCKET s, const char FAR *buf, int len,
  65. int flags);
  66. typedef int (_stdcall *shutdownProc) (SOCKET s, int how);
  67. typedef SOCKET (_stdcall *socketProc) (int af, int type, int protocol);
  68. /**********************/
  69. /* External variables */
  70. /**********************/
  71. /********************/
  72. /* Static constants */
  73. /********************/
  74. /********************/
  75. /* Static variables */
  76. /********************/
  77. static WSADATA stWSAData;
  78. // Routines from ws2_32.dll
  79. static WSACleanupProc stWSACleanupProc;
  80. static WSAGetLastErrorProc stWSAGetLastErrorProc;
  81. static acceptProc stAcceptProc;
  82. static bindProc stBindProc;
  83. static closesocketProc stCloseSocketProc;
  84. static connectProc stConnectProc;
  85. static gethostbyaddrProc stGetHostByAddrProc;
  86. static gethostbynameProc stGetHostByNameProc;
  87. static gethostnameProc stGetHostNameProc;
  88. static htonsProc stHtoNSProc;
  89. static inet_addrProc stInetAddrProc;
  90. static inet_ntoaProc stInetNtoAProc;
  91. static ioctlsocketProc stIoctlSocketProc;
  92. static listenProc stListenProc;
  93. static recvProc stRecvProc;
  94. static selectProc stSelectProc;
  95. static sendProc stSendProc;
  96. static shutdownProc stShutDownProc;
  97. static socketProc stSocketProc;
  98. /******************************/
  99. /* Static callback procedures */
  100. /******************************/
  101. /*********************/
  102. /* Static procedures */
  103. /*********************/
  104. static char *MyGetCookies (const char *pmURL);
  105. static void MyProcessWin32Error (int pmWin32Error);
  106. static void MyProcessWSAError (int *pmStatus);
  107. /***********************/
  108. /* External procedures */
  109. /***********************/
  110. /************************************************************************/
  111. /* MDIONet_Init */
  112. /************************************************************************/
  113. BOOL MDIONet_Init (void)
  114. {
  115. HMODULE myWinSockDLL;
  116. WSAStartupProc myWSAStartupProc;
  117. // To avoid auto loading the ws2_32.dll, we make all the calls
  118. // by loading up the function's address
  119. myWinSockDLL = LoadLibrary ("ws2_32.dll");
  120. if (myWinSockDLL == NULL)
  121. {
  122. // The DLL doesn't exist on this platform.
  123. return FALSE;
  124. }
  125. myWSAStartupProc = (WSAStartupProc) GetProcAddress (myWinSockDLL,
  126. "WSAStartup");
  127. if (myWSAStartupProc == NULL)
  128. {
  129. // The routine was not found in the DLL.
  130. return FALSE;
  131. }
  132. stWSACleanupProc = (WSACleanupProc) GetProcAddress (myWinSockDLL,
  133. "WSACleanup");
  134. if (stWSACleanupProc == NULL)
  135. {
  136. // The routine was not found in the DLL.
  137. return FALSE;
  138. }
  139. stWSAGetLastErrorProc = (WSAGetLastErrorProc) GetProcAddress (myWinSockDLL,
  140. "WSAGetLastError");
  141. if (stWSAGetLastErrorProc == NULL)
  142. {
  143. // The routine was not found in the DLL.
  144. return FALSE;
  145. }
  146. stAcceptProc = (acceptProc) GetProcAddress (myWinSockDLL, "accept");
  147. if (stAcceptProc == NULL)
  148. {
  149. // The routine was not found in the DLL.
  150. return FALSE;
  151. }
  152. stBindProc = (bindProc) GetProcAddress (myWinSockDLL, "bind");
  153. if (stBindProc == NULL)
  154. {
  155. // The routine was not found in the DLL.
  156. return FALSE;
  157. }
  158. stCloseSocketProc = (closesocketProc) GetProcAddress (myWinSockDLL,
  159. "closesocket");
  160. if (stCloseSocketProc == NULL)
  161. {
  162. // The routine was not found in the DLL.
  163. return FALSE;
  164. }
  165. stConnectProc = (connectProc) GetProcAddress (myWinSockDLL, "connect");
  166. if (stConnectProc == NULL)
  167. {
  168. // The routine was not found in the DLL.
  169. return FALSE;
  170. }
  171. stGetHostByAddrProc = (gethostbyaddrProc) GetProcAddress (myWinSockDLL,
  172. "gethostbyaddr");
  173. if (stGetHostByAddrProc == NULL)
  174. {
  175. // The routine was not found in the DLL.
  176. return FALSE;
  177. }
  178. stGetHostByNameProc = (gethostbynameProc) GetProcAddress (myWinSockDLL,
  179. "gethostbyname");
  180. if (stGetHostByNameProc == NULL)
  181. {
  182. // The routine was not found in the DLL.
  183. return FALSE;
  184. }
  185. stGetHostNameProc = (gethostnameProc) GetProcAddress (myWinSockDLL,
  186. "gethostname");
  187. if (stGetHostNameProc == NULL)
  188. {
  189. // The routine was not found in the DLL.
  190. return FALSE;
  191. }
  192. stHtoNSProc = (htonsProc) GetProcAddress (myWinSockDLL, "htons");
  193. if (stHtoNSProc == NULL)
  194. {
  195. // The routine was not found in the DLL.
  196. return FALSE;
  197. }
  198. stInetAddrProc = (inet_addrProc) GetProcAddress (myWinSockDLL, "inet_addr");
  199. if (stInetAddrProc == NULL)
  200. {
  201. // The routine was not found in the DLL.
  202. return FALSE;
  203. }
  204. stInetNtoAProc = (inet_ntoaProc) GetProcAddress (myWinSockDLL, "inet_ntoa");
  205. if (stInetNtoAProc == NULL)
  206. {
  207. // The routine was not found in the DLL.
  208. return FALSE;
  209. }
  210. stIoctlSocketProc = (ioctlsocketProc) GetProcAddress (myWinSockDLL, "ioctlsocket");
  211. if (stIoctlSocketProc == NULL)
  212. {
  213. // The routine was not found in the DLL.
  214. return FALSE;
  215. }
  216. stListenProc = (listenProc) GetProcAddress (myWinSockDLL, "listen");
  217. if (stListenProc == NULL)
  218. {
  219. // The routine was not found in the DLL.
  220. return FALSE;
  221. }
  222. stRecvProc = (recvProc) GetProcAddress (myWinSockDLL, "recv");
  223. if (stRecvProc == NULL)
  224. {
  225. // The routine was not found in the DLL.
  226. return FALSE;
  227. }
  228. stSelectProc = (selectProc) GetProcAddress (myWinSockDLL, "select");
  229. if (stSelectProc == NULL)
  230. {
  231. // The routine was not found in the DLL.
  232. return FALSE;
  233. }
  234. stSendProc = (sendProc) GetProcAddress (myWinSockDLL, "send");
  235. if (stSendProc == NULL)
  236. {
  237. // The routine was not found in the DLL.
  238. return FALSE;
  239. }
  240. stShutDownProc = (shutdownProc) GetProcAddress (myWinSockDLL, "shutdown");
  241. if (stShutDownProc == NULL)
  242. {
  243. // The routine was not found in the DLL.
  244. return FALSE;
  245. }
  246. stSocketProc = (socketProc) GetProcAddress (myWinSockDLL, "socket");
  247. if (stSocketProc == NULL)
  248. {
  249. // The routine was not found in the DLL.
  250. return FALSE;
  251. }
  252. // Start up WinSock
  253. (myWSAStartupProc) (MAKEWORD(2, 0), &stWSAData);
  254. return TRUE;
  255. } // MDIONet_Init
  256. /************************************************************************/
  257. /* MDIONet_Finalize */
  258. /************************************************************************/
  259. void MDIONet_Finalize (void)
  260. {
  261. (stWSACleanupProc) ();
  262. } // MDIONet_Finalize
  263. /************************************************************************/
  264. /* MDIO_AllocateSockAddr */
  265. /************************************************************************/
  266. SOCK_ADDR MDIO_AllocateSockAddr (void)
  267. {
  268. struct sockaddr_in *mySockAddr;
  269. mySockAddr = (struct sockaddr_in *) malloc (sizeof (struct sockaddr_in));
  270. if (mySockAddr != NULL)
  271. {
  272. memset (mySockAddr, 0, sizeof (struct sockaddr_in));
  273. }
  274. return mySockAddr;
  275. } // MDIO_AllocateSockAddr
  276. /************************************************************************/
  277. /* MDIONet_CheckStatus */
  278. /* */
  279. /* This routine checks readability of the socket. The routine returns */
  280. /* true if a recv could be done without blocking. This occurs when */
  281. /* there is data waiting, or when the connection has been closed or */
  282. /* when the connection has been reset (WSAECONNRESET). If the select */
  283. /* returns 0, then no reading can be done, but it also means that the */
  284. /* connection has not been closed. */
  285. /************************************************************************/
  286. BOOL MDIONet_CheckStatus (SOCK pmSocket, int *pmStatus)
  287. {
  288. // Check for EOF condition
  289. // TW : Changing the call to recv to a call to select (non-blocking)
  290. struct timeval myTimeout;
  291. fd_set mySockets;
  292. int myResult;
  293. FD_ZERO (&mySockets);
  294. FD_SET ((SOCKET) pmSocket, &mySockets);
  295. myTimeout.tv_sec = 0;
  296. myTimeout.tv_usec = 0;
  297. myResult = (stSelectProc) (0, &mySockets, (fd_set *) NULL,
  298. (fd_set *) NULL, &myTimeout);
  299. if (myResult == SOCKET_ERROR)
  300. {
  301. // Select failed
  302. MyProcessWSAError (pmStatus);
  303. return FALSE;
  304. }
  305. return (myResult != 0);
  306. } // MDIONet_CheckStatus
  307. /************************************************************************/
  308. /* MDIONet_CloseSocket */
  309. /************************************************************************/
  310. void MDIONet_CloseSocket (SOCK pmSocket)
  311. {
  312. (stCloseSocketProc) ((SOCKET) pmSocket);
  313. } // MDIONet_CreateSocket
  314. /************************************************************************/
  315. /* MDIONet_Bind */
  316. /************************************************************************/
  317. BOOL MDIONet_Bind (SOCK pmSocket, int pmPort)
  318. {
  319. struct sockaddr_in mySockAddr;
  320. int myResult;
  321. mySockAddr.sin_family = AF_INET;
  322. mySockAddr.sin_port = (stHtoNSProc) ((USHORT) pmPort);
  323. mySockAddr.sin_addr.s_addr = INADDR_ANY;
  324. myResult = (stBindProc) ((SOCKET) pmSocket, (struct sockaddr *) &mySockAddr,
  325. sizeof (struct sockaddr));
  326. if (myResult == SOCKET_ERROR)
  327. {
  328. // Bind failed
  329. MyProcessWSAError (NULL);
  330. return FALSE;
  331. }
  332. return TRUE;
  333. } // MDIONet_Bind
  334. /************************************************************************/
  335. /* MDIONet_CharsWaiting */
  336. /************************************************************************/
  337. BOOL MDIONet_CharsWaiting (SOCK pmSocket, unsigned long *pmNum,
  338. int *pmStatus)
  339. {
  340. if ((stIoctlSocketProc) ((SOCKET) pmSocket, FIONREAD, pmNum) ==
  341. SOCKET_ERROR)
  342. {
  343. // Check failed
  344. MyProcessWSAError (pmStatus);
  345. return FALSE;
  346. }
  347. return TRUE;
  348. } // MDIONet_CharsWaiting
  349. /************************************************************************/
  350. /* MDIONet_Connect */
  351. /************************************************************************/
  352. BOOL MDIONet_Connect (SOCK pmSocket, SOCK_ADDR pmSockAddr, int pmPort,
  353. NET_ADDR pmAddr)
  354. {
  355. int myResult;
  356. ((struct sockaddr_in *) pmSockAddr) -> sin_family = AF_INET;
  357. ((struct sockaddr_in *) pmSockAddr) -> sin_port =
  358. (stHtoNSProc) ((USHORT) pmPort);
  359. ((struct sockaddr_in *) pmSockAddr) -> sin_addr.s_addr =
  360. (unsigned long) pmAddr;
  361. myResult = (stConnectProc) ((SOCKET) pmSocket,
  362. (struct sockaddr *) pmSockAddr,
  363. sizeof (struct sockaddr));
  364. if (myResult == SOCKET_ERROR)
  365. {
  366. // Connect failed
  367. // MIOCommon_VAOkMsgBox ("connect failed: %ld",
  368. // (stWSAGetLastErrorProc) ());
  369. MyProcessWSAError (NULL);
  370. return FALSE;
  371. }
  372. return TRUE;
  373. } // MDIONet_Connect
  374. /************************************************************************/
  375. /* MDIONet_CreateSocket */
  376. /************************************************************************/
  377. SOCK MDIONet_CreateSocket (void)
  378. {
  379. SOCKET mySocket;
  380. mySocket = (stSocketProc) (AF_INET, SOCK_STREAM, 0);
  381. if (mySocket == INVALID_SOCKET)
  382. {
  383. MyProcessWSAError (NULL);
  384. return NULL;
  385. }
  386. return (SOCK) mySocket;
  387. } // MDIONet_CreateSocket
  388. /************************************************************************/
  389. /* MDIONet_GetCookie */
  390. /************************************************************************/
  391. void MDIONet_GetCookie (OOTstring pmCookieValue,
  392. const OOTstring pmURL,
  393. const OOTstring pmCookieName)
  394. {
  395. char *myData;
  396. char *myPtr, *myEqualsSign, *myEndOfCookie;
  397. char *myNamePtr, *myEndNamePtr, *myValPtr, *myEndValPtr;
  398. myData = MyGetCookies (pmURL);
  399. if (myData == NULL)
  400. {
  401. pmCookieValue [0] = 0;
  402. return;
  403. }
  404. myEndOfCookie = myData - 1;
  405. while (TRUE)
  406. {
  407. // We reached the end last iteration
  408. if (myEndOfCookie == NULL)
  409. {
  410. MIOError_SetErrNo (E_NET_NO_COOKIE_FOR_THIS_NAME);
  411. pmCookieValue [0] = 0;
  412. break;
  413. }
  414. else
  415. {
  416. myPtr = myEndOfCookie + 1;
  417. }
  418. myEndOfCookie = strchr (myPtr, ';');
  419. if (myEndOfCookie != NULL)
  420. {
  421. *myEndOfCookie = 0;
  422. }
  423. myEqualsSign = strchr (myPtr, '=');
  424. if (myEqualsSign == NULL)
  425. {
  426. // No name=value pair, skip to the next one
  427. continue;
  428. }
  429. // We foudn an equals sign, trim the name
  430. myNamePtr = myPtr;
  431. while (*myNamePtr == ' ')
  432. {
  433. myNamePtr++;
  434. }
  435. myEndNamePtr = myEqualsSign;
  436. do
  437. {
  438. *myEndNamePtr = 0;
  439. myEndNamePtr--;
  440. } while (*myEndNamePtr == ' ');
  441. // Let's see if there's a match
  442. if (strcmp (pmCookieName, myNamePtr) != 0)
  443. {
  444. // No match, skip to next one
  445. continue;
  446. }
  447. // There's a match - Trim the value
  448. myValPtr = myEqualsSign + 1;
  449. while (*myValPtr == ' ')
  450. {
  451. myValPtr++;
  452. }
  453. myEndValPtr = myValPtr + strlen (myValPtr) - 1;
  454. while (*myEndValPtr == ' ')
  455. {
  456. *myEndValPtr = 0;
  457. myEndValPtr--;
  458. }
  459. if (strlen (myValPtr) > 255)
  460. {
  461. // TW Set cookie too long
  462. strncpy (pmCookieValue, myValPtr, 255);
  463. pmCookieValue [255] = 0;
  464. }
  465. else
  466. {
  467. strcpy (pmCookieValue, myValPtr);
  468. }
  469. break;
  470. } // for (;;)
  471. free (myData);
  472. } // MDIONet_GetCookie
  473. /************************************************************************/
  474. /* MDIONet_GetCookies */
  475. /************************************************************************/
  476. //extern void MDIONet_GetCookies (const OOTString pmURL,
  477. // OOTstring pmCookieName []
  478. // OOTstring pmCookieValue [])
  479. // {
  480. // } // MDIONet_GetCookies
  481. /************************************************************************/
  482. /* MDIONet_GetHostAddressByName */
  483. /************************************************************************/
  484. void MDIONet_GetHostAddressByName (OOTstring pmNetAddress,
  485. const OOTstring pmNetName)
  486. {
  487. struct hostent *myHostEntry;
  488. struct in_addr myAddress;
  489. pmNetAddress [0] = 0;
  490. myHostEntry = (stGetHostByNameProc) (pmNetName);
  491. if (myHostEntry)
  492. {
  493. memcpy (&myAddress, myHostEntry -> h_addr_list[0],
  494. myHostEntry -> h_length);
  495. strcpy (pmNetAddress, (stInetNtoAProc) (myAddress));
  496. }
  497. else
  498. {
  499. MyProcessWSAError (NULL);
  500. }
  501. } // MDIONet_GetHostAddressByName
  502. /************************************************************************/
  503. /* MDIONet_GetHostName */
  504. /************************************************************************/
  505. void MDIONet_GetHostName (OOTstring pmNetName, int pmMaxLen)
  506. {
  507. (stGetHostNameProc) (pmNetName, pmMaxLen);
  508. } // MDIONet_GetHostName
  509. /************************************************************************/
  510. /* MDIONet_GetHostNameByAddress */
  511. /************************************************************************/
  512. void MDIONet_GetHostNameByAddress (OOTstring pmNetName,
  513. const OOTstring pmNetAddress)
  514. {
  515. struct hostent *myHostEntry;
  516. NET_ADDR myAddr;
  517. pmNetName [0] = 0;
  518. myAddr = (NET_ADDR) (stInetAddrProc) (pmNetAddress);
  519. if (myAddr == (NET_ADDR) INADDR_NONE)
  520. {
  521. SET_ERRNO (E_NET_BAD_ADDRESS);
  522. return;
  523. }
  524. myHostEntry = (stGetHostByAddrProc) ((char *) &myAddr, 4, AF_INET);
  525. if (myHostEntry)
  526. {
  527. strcpy (pmNetName, myHostEntry -> h_name);
  528. }
  529. else
  530. {
  531. MyProcessWSAError (NULL);
  532. }
  533. } // MDIONet_GetHostNameByAddress
  534. /************************************************************************/
  535. /* MDIONet_GetNetAddress */
  536. /************************************************************************/
  537. void MDIONet_GetNetAddress (SOCK_ADDR pmSockAddr, char *pmNetAddress)
  538. {
  539. strcpy (pmNetAddress,
  540. (stInetNtoAProc) (((struct sockaddr_in *) pmSockAddr) -> sin_addr));
  541. } // MDIONet_GetNetAddress
  542. /************************************************************************/
  543. /* MDIONet_GetNetworkAddrByString */
  544. /************************************************************************/
  545. NET_ADDR MDIONet_GetNetworkAddrByString (const OOTstring pmAddress)
  546. {
  547. NET_ADDR myAddr;
  548. // Is the address in "a.b.c.d" format or a machine name
  549. if (isdigit (pmAddress [0]))
  550. {
  551. myAddr = (NET_ADDR) (stInetAddrProc) (pmAddress);
  552. if (myAddr == (NET_ADDR) INADDR_NONE)
  553. {
  554. // Bad address
  555. SET_ERRNO (E_NET_BAD_ADDRESS);
  556. return NULL;
  557. }
  558. }
  559. else
  560. {
  561. struct hostent *myHostEntry = (stGetHostByNameProc) (pmAddress);
  562. struct in_addr myInAddr;
  563. if (myHostEntry == NULL)
  564. {
  565. // Couldn't resolve name
  566. SET_ERRNO (E_NET_NAME_RESOLUTION_FAILED);
  567. return NULL;
  568. }
  569. memcpy (&myInAddr, myHostEntry -> h_addr_list[0],
  570. myHostEntry -> h_length);
  571. myAddr = (NET_ADDR) myInAddr.s_addr;
  572. }
  573. return myAddr;
  574. } // MDIONet_GetNetworkAddrByString
  575. /************************************************************************/
  576. /* MDIONet_GetCookie */
  577. /************************************************************************/
  578. int MDIONet_GetNumCookies (const OOTstring pmURL)
  579. {
  580. char *myData;
  581. char *myPtr, *myEqualsSign, *myEndOfCookie;
  582. int myNumCookies = 0;
  583. myData = MyGetCookies (pmURL);
  584. myEndOfCookie = myData - 1;
  585. while (TRUE)
  586. {
  587. // We reached the end last iteration
  588. if (myEndOfCookie == NULL)
  589. {
  590. break;
  591. }
  592. myPtr = myEndOfCookie + 1;
  593. myEndOfCookie = strchr (myPtr, ';');
  594. if (myEndOfCookie != NULL)
  595. {
  596. *myEndOfCookie = 0;
  597. }
  598. myEqualsSign = strchr (myPtr, '=');
  599. if (myEqualsSign == NULL)
  600. {
  601. // No name=value pair, skip to the next one
  602. continue;
  603. }
  604. myNumCookies++;
  605. } // for (;;)
  606. free (myData);
  607. return (myNumCookies);
  608. } // MDIONet_GetNumCookies
  609. /************************************************************************/
  610. /* MDIONet_HasConnected */
  611. /************************************************************************/
  612. BOOL MDIONet_HasConnected (SOCK *pmSocket, SOCK pmOrigSocket,
  613. SOCK_ADDR pmSockAddr)
  614. {
  615. int myLen = sizeof (struct sockaddr_in);
  616. SOCKET mySocket;
  617. mySocket = (stAcceptProc) ((SOCKET) pmOrigSocket,
  618. (struct sockaddr *) pmSockAddr, &myLen);
  619. if (mySocket != INVALID_SOCKET)
  620. {
  621. * (SOCKET *) pmSocket = mySocket;
  622. return TRUE;
  623. }
  624. return FALSE;
  625. } // MDIONet_HasConnected
  626. /************************************************************************/
  627. /* MDIONet_Listen */
  628. /************************************************************************/
  629. BOOL MDIONet_Listen (SOCK pmSocket, int *pmStatus)
  630. {
  631. int myResult;
  632. myResult = (stListenProc) ((SOCKET) pmSocket, SOMAXCONN);
  633. if (myResult == SOCKET_ERROR)
  634. {
  635. // Listen failed
  636. MyProcessWSAError (pmStatus);
  637. return FALSE;
  638. }
  639. return TRUE;
  640. } // MDIONet_Listen
  641. /************************************************************************/
  642. /* MDIONet_Receive */
  643. /************************************************************************/
  644. BOOL MDIONet_Receive (SOCK pmSocket, char *pmBuffer, int pmBytesToRead,
  645. int *pmBytesRead, BOOL *pmWouldBlock, int *pmStatus)
  646. {
  647. int myBytesRead;
  648. if (pmWouldBlock != NULL)
  649. {
  650. *pmWouldBlock = FALSE;
  651. }
  652. myBytesRead = (stRecvProc) ((SOCKET) pmSocket, pmBuffer, pmBytesToRead, 0);
  653. if (myBytesRead == SOCKET_ERROR)
  654. {
  655. // Receive failed
  656. if ((stWSAGetLastErrorProc) () == WSAEWOULDBLOCK)
  657. {
  658. if (pmWouldBlock != NULL)
  659. {
  660. *pmWouldBlock = FALSE;
  661. }
  662. }
  663. MyProcessWSAError (pmStatus);
  664. *pmBytesRead = 0;
  665. return FALSE;
  666. }
  667. *pmBytesRead = myBytesRead;
  668. return TRUE;
  669. } // MDIONet_Receive
  670. /************************************************************************/
  671. /* MDIONet_Send */
  672. /************************************************************************/
  673. BOOL MDIONet_Send (SOCK pmSocket, const char *pmMessage, int *pmStatus)
  674. {
  675. int myResult;
  676. myResult = (stSendProc) ((SOCKET) pmSocket, pmMessage,
  677. strlen (pmMessage), 0);
  678. if (myResult == SOCKET_ERROR)
  679. {
  680. // Send failed
  681. MyProcessWSAError (pmStatus);
  682. return FALSE;
  683. }
  684. return TRUE;
  685. } // MDIONet_Send
  686. /************************************************************************/
  687. /* MDIONet_SendBytes */
  688. /************************************************************************/
  689. BOOL MDIONet_SendBytes (SOCK pmSocket, const char *pmBuffer, int pmLen,
  690. int *pmStatus)
  691. {
  692. int myResult;
  693. myResult = (stSendProc) ((SOCKET) pmSocket, pmBuffer, pmLen, 0);
  694. if (myResult == SOCKET_ERROR)
  695. {
  696. // Send failed
  697. MyProcessWSAError (pmStatus);
  698. return FALSE;
  699. }
  700. return TRUE;
  701. } // MDIONet_SendBytes
  702. /************************************************************************/
  703. /* MDIONet_SetCookie */
  704. /************************************************************************/
  705. void MDIONet_SetCookie (const char *pmURL,
  706. const OOTstring pmCookieName,
  707. const OOTstring pmCookieValue,
  708. const char *pmExpiryDate)
  709. {
  710. char myString [1024];
  711. int myErr;
  712. if (pmExpiryDate [0] == 0)
  713. {
  714. wsprintf (myString, "%s=%s", pmCookieName, pmCookieValue);
  715. }
  716. else
  717. {
  718. wsprintf (myString, "%s=%s; Expires=%s", pmCookieName, pmCookieValue,
  719. pmExpiryDate);
  720. }
  721. InternetSetCookie (pmURL, NULL, myString);
  722. myErr = GetLastError ();
  723. MyProcessWin32Error (myErr);
  724. } // MDIONet_SetCookie
  725. /************************************************************************/
  726. /* MDIONet_SetNonBlocking */
  727. /************************************************************************/
  728. BOOL MDIONet_SetNonBlocking (SOCK pmSocket)
  729. {
  730. int myVal = 1;
  731. // Set to non-blocking mode
  732. if ((stIoctlSocketProc) ((SOCKET) pmSocket, FIONBIO, &myVal) != 0)
  733. {
  734. MyProcessWSAError(NULL);
  735. return FALSE;
  736. }
  737. return TRUE;
  738. } // MDIONet_SetNonBlocking
  739. /************************************************************************/
  740. /* MDIONet_ShutDownSocket */
  741. /************************************************************************/
  742. void MDIONet_ShutDownSocket (SOCK pmSocket)
  743. {
  744. (stShutDownProc) ((SOCKET) pmSocket, SD_SEND);
  745. } // MDIONet_ShutDownSocket
  746. /******************************/
  747. /* Static callback procedures */
  748. /******************************/
  749. /*********************/
  750. /* Static procedures */
  751. /*********************/
  752. /************************************************************************/
  753. /* MyGetCookies */
  754. /************************************************************************/
  755. static char *MyGetCookies (const char *pmURL)
  756. {
  757. BOOL myRes;
  758. int myErr;
  759. int mySize = 0;
  760. char *myData;
  761. myRes = InternetGetCookie (pmURL, NULL, NULL, &mySize);
  762. myErr = GetLastError ();
  763. if (myErr != 0)
  764. {
  765. MyProcessWin32Error (myErr);
  766. }
  767. if (mySize == 0)
  768. {
  769. // Successful - must mean no cookies
  770. MIOError_SetErrNo (E_NET_NO_COOKIE_FOR_URL);
  771. return NULL;
  772. }
  773. // Allocate the buffer sufficient for the cookie
  774. myData = malloc (mySize + 1000);
  775. mySize += 1000;
  776. myRes = InternetGetCookie (pmURL, NULL, myData, &mySize);
  777. MyProcessWin32Error (GetLastError ());
  778. if (myRes)
  779. {
  780. return myData;
  781. }
  782. else
  783. {
  784. free (myData);
  785. return NULL;
  786. }
  787. } // MyGetCookies
  788. /************************************************************************/
  789. /* MyProcessWin32Error */
  790. /************************************************************************/
  791. static void MyProcessWin32Error (int pmWin32Error)
  792. {
  793. switch (pmWin32Error)
  794. {
  795. case 0:
  796. // Leave previous error untouched.
  797. break;
  798. case ERROR_NO_MORE_ITEMS:
  799. MIOError_SetErrNo (E_NET_NO_COOKIE_FOR_URL);
  800. break;
  801. case 12005:
  802. MIOError_SetErrNo (E_NET_BAD_COOKIE_URL);
  803. break;
  804. case 12006:
  805. MIOError_SetErrNo (E_NET_BAD_COOKIE_URL);
  806. break;
  807. default:
  808. MIOError_SetErrMsg (E_NET_UNKNOWN_ERROR,
  809. "Net Error. Win32 Error #%d", pmWin32Error);
  810. }
  811. } // MyProcessWin32Error
  812. /************************************************************************/
  813. /* MyProcessWSAError */
  814. /************************************************************************/
  815. static void MyProcessWSAError (int *pmStatus)
  816. {
  817. switch ((stWSAGetLastErrorProc) ())
  818. {
  819. case WSAECONNABORTED:
  820. MIOError_SetErrNo (E_NET_CONNECTION_ABORTED);
  821. if (pmStatus != NULL)
  822. {
  823. *pmStatus = NET_STATUS_ABORTED_LOCAL;
  824. }
  825. break;
  826. case WSAECONNRESET:
  827. MIOError_SetErrNo (E_NET_CONNECTION_ABORTED_REMOTE);
  828. if (pmStatus != NULL)
  829. {
  830. *pmStatus = NET_STATUS_ABORTED_REMOTE;
  831. }
  832. break;
  833. default:
  834. MIOError_SetErrMsg (E_NET_UNKNOWN_ERROR,
  835. "Net Error. Windows Socket Library Error #%d",
  836. (stWSAGetLastErrorProc) ());
  837. }
  838. } // MyProcessWSAError