PageRenderTime 44ms CodeModel.GetById 4ms RepoModel.GetById 0ms app.codeStats 0ms

/libs/l_net/l_net_berkley.c

https://gitlab.com/illwieckz/netradiant
C | 748 lines | 422 code | 69 blank | 257 comment | 111 complexity | 7614aae079cf7b0226eb84d2218025f1 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, LGPL-2.0
  1. /*
  2. Copyright (C) 1999-2006 Id Software, Inc. and contributors.
  3. For a list of contributors, see the accompanying CONTRIBUTORS file.
  4. This file is part of GtkRadiant.
  5. GtkRadiant is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. GtkRadiant is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with GtkRadiant; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  16. */
  17. //===========================================================================
  18. //
  19. // Name: l_net_wins.c
  20. // Function: WinSock
  21. // Programmer: MrElusive
  22. // Last update: TTimo: cross-platform version, l_net library
  23. // Tab Size: 2
  24. // Notes:
  25. //===========================================================================
  26. //#include <windows.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include "l_net.h"
  31. #include "l_net_wins.h"
  32. #include <sys/types.h>
  33. #include <sys/socket.h>
  34. #include <sys/ioctl.h>
  35. #include <netinet/in.h>
  36. #include <netinet/tcp.h>
  37. #include <arpa/inet.h>
  38. #include <errno.h>
  39. #include <netdb.h>
  40. #include <unistd.h>
  41. #include <stdarg.h>
  42. #include <stdio.h>
  43. const int SOCKET_ERROR = -1;
  44. const int INVALID_SOCKET = -1;
  45. #define WinError WinPrint
  46. #define ioctlsocket ioctl
  47. #define closesocket close
  48. int WSAGetLastError(){
  49. return errno;
  50. }
  51. /*
  52. typedef struct tag_error_struct
  53. {
  54. int errnum;
  55. LPSTR errstr;
  56. } ERROR_STRUCT;
  57. */
  58. typedef struct tag_error_struct
  59. {
  60. int errnum;
  61. const char *errstr;
  62. } ERROR_STRUCT;
  63. #define NET_NAMELEN 64
  64. static char my_tcpip_address[NET_NAMELEN];
  65. const int DEFAULTnet_hostport = 26000;
  66. const int MAXHOSTNAMELEN = 256;
  67. static int net_acceptsocket = -1; // socket for fielding new connections
  68. static int net_controlsocket;
  69. static int net_hostport; // udp port number for acceptsocket
  70. static int net_broadcastsocket = 0;
  71. //static qboolean ifbcastinit = qfalse;
  72. //static struct sockaddr_s broadcastaddr;
  73. static struct sockaddr_s broadcastaddr;
  74. static unsigned long myAddr;
  75. ERROR_STRUCT errlist[] = {
  76. {EACCES,"EACCES - The address is protected, user is not root"},
  77. {EAGAIN,"EAGAIN - Operation on non-blocking socket that cannot return immediatly"},
  78. {EBADF, "EBADF - sockfd is not a valid descriptor"},
  79. {EFAULT, "EFAULT - The parameter is not in a writable part of the user address space"},
  80. {EINVAL,"EINVAL - The socket is already bound to an address"},
  81. {ENOBUFS,"ENOBUFS - not enough memory"},
  82. {ENOMEM, "ENOMEM - not enough memory"},
  83. {ENOTCONN, "ENOTCONN - not connected"},
  84. {ENOTSOCK,"ENOTSOCK - Argument is file descriptor not a socket"},
  85. {EOPNOTSUPP,"ENOTSUPP - The referenced socket is not of type SOCK_STREAM"},
  86. {EPERM, "EPERM - Firewall rules forbid connection"},
  87. {-1, NULL}
  88. };
  89. //===========================================================================
  90. //
  91. // Parameter: -
  92. // Returns: -
  93. // Changes Globals: -
  94. //===========================================================================
  95. const char *WINS_ErrorMessage( int error ){
  96. int search = 0;
  97. if ( !error ) {
  98. return "No error occurred";
  99. }
  100. for ( search = 0; errlist[search].errstr; search++ )
  101. {
  102. if ( error == errlist[search].errnum ) {
  103. return errlist[search].errstr;
  104. }
  105. } //end for
  106. return "Unknown error";
  107. } //end of the function WINS_ErrorMessage
  108. //===========================================================================
  109. //
  110. // Parameter: -
  111. // Returns: -
  112. // Changes Globals: -
  113. //===========================================================================
  114. int WINS_Init( void ){
  115. int i;
  116. struct hostent *local;
  117. char buff[MAXHOSTNAMELEN];
  118. struct sockaddr_s addr;
  119. char *p;
  120. /*
  121. linux doesn't have anything to initialize for the net
  122. "Windows .. built for the internet .. the internet .. built with unix"
  123. */
  124. #if 0
  125. WORD wVersionRequested;
  126. wVersionRequested = MAKEWORD( 2, 2 );
  127. r = WSAStartup( wVersionRequested, &winsockdata );
  128. if ( r ) {
  129. WinPrint( "Winsock initialization failed.\n" );
  130. return -1;
  131. }
  132. #endif
  133. /*
  134. i = COM_CheckParm ("-udpport");
  135. if (i == 0)*/
  136. net_hostport = DEFAULTnet_hostport;
  137. /*
  138. else if (i < com_argc-1)
  139. net_hostport = Q_atoi (com_argv[i+1]);
  140. else
  141. Sys_Error ("WINS_Init: you must specify a number after -udpport");
  142. */
  143. // determine my name & address
  144. gethostname( buff, MAXHOSTNAMELEN );
  145. local = gethostbyname( buff );
  146. if(local && local->h_addr_list && local->h_addr_list[0])
  147. myAddr = *(int *)local->h_addr_list[0];
  148. else
  149. myAddr = inet_addr("127.0.0.1");
  150. // if the quake hostname isn't set, set it to the machine name
  151. // if (Q_strcmp(hostname.string, "UNNAMED") == 0)
  152. {
  153. // see if it's a text IP address (well, close enough)
  154. for ( p = buff; *p; p++ )
  155. if ( ( *p < '0' || *p > '9' ) && *p != '.' ) {
  156. break;
  157. }
  158. // if it is a real name, strip off the domain; we only want the host
  159. if ( *p ) {
  160. for ( i = 0; i < 15; i++ )
  161. if ( buff[i] == '.' ) {
  162. break;
  163. }
  164. buff[i] = 0;
  165. }
  166. // Cvar_Set ("hostname", buff);
  167. }
  168. //++timo WTF is that net_controlsocket? it's sole purpose is to retrieve the local IP?
  169. if ( ( net_controlsocket = WINS_OpenSocket( 0 ) ) == SOCKET_ERROR ) {
  170. WinError( "WINS_Init: Unable to open control socket\n" );
  171. }
  172. ( (struct sockaddr_in *)&broadcastaddr )->sin_family = AF_INET;
  173. ( (struct sockaddr_in *)&broadcastaddr )->sin_addr.s_addr = INADDR_BROADCAST;
  174. ( (struct sockaddr_in *)&broadcastaddr )->sin_port = htons( (u_short)net_hostport );
  175. WINS_GetSocketAddr( net_controlsocket, &addr );
  176. strcpy( my_tcpip_address, WINS_AddrToString( &addr ) );
  177. p = strrchr( my_tcpip_address, ':' );
  178. if ( p ) {
  179. *p = 0;
  180. }
  181. WinPrint( "Winsock Initialized\n" );
  182. return net_controlsocket;
  183. } //end of the function WINS_Init
  184. //===========================================================================
  185. //
  186. // Parameter: -
  187. // Returns: -
  188. // Changes Globals: -
  189. //===========================================================================
  190. char *WINS_MyAddress( void ){
  191. return my_tcpip_address;
  192. } //end of the function WINS_MyAddress
  193. //===========================================================================
  194. //
  195. // Parameter: -
  196. // Returns: -
  197. // Changes Globals: -
  198. //===========================================================================
  199. void WINS_Shutdown( void ){
  200. //WINS_Listen(0);
  201. WINS_CloseSocket( net_controlsocket );
  202. // WSACleanup();
  203. //
  204. //WinPrint("Winsock Shutdown\n");
  205. } //end of the function WINS_Shutdown
  206. //===========================================================================
  207. //
  208. // Parameter: -
  209. // Returns: -
  210. // Changes Globals: -
  211. //===========================================================================
  212. /*
  213. void WINS_Listen(int state)
  214. {
  215. // enable listening
  216. if (state)
  217. {
  218. if (net_acceptsocket != -1)
  219. return;
  220. if ((net_acceptsocket = WINS_OpenSocket (net_hostport)) == -1)
  221. WinError ("WINS_Listen: Unable to open accept socket\n");
  222. return;
  223. }
  224. // disable listening
  225. if (net_acceptsocket == -1)
  226. return;
  227. WINS_CloseSocket (net_acceptsocket);
  228. net_acceptsocket = -1;
  229. } //end of the function WINS_Listen*/
  230. //===========================================================================
  231. //
  232. // Parameter: -
  233. // Returns: -
  234. // Changes Globals: -
  235. //===========================================================================
  236. int WINS_OpenSocket( int port ){
  237. int newsocket;
  238. struct sockaddr_in address;
  239. u_long _true = 1;
  240. if ( ( newsocket = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ) ) == SOCKET_ERROR ) {
  241. WinPrint( "WINS_OpenSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  242. return -1;
  243. } //end if
  244. if ( ioctlsocket( newsocket, FIONBIO, &_true ) == SOCKET_ERROR ) {
  245. WinPrint( "WINS_OpenSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  246. closesocket( newsocket );
  247. return -1;
  248. } //end if
  249. memset( (char *) &address, 0, sizeof( address ) );
  250. address.sin_family = AF_INET;
  251. address.sin_addr.s_addr = INADDR_ANY;
  252. address.sin_port = htons( (u_short)port );
  253. if ( bind( newsocket, (void *)&address, sizeof( address ) ) == -1 ) {
  254. WinPrint( "WINS_OpenSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  255. closesocket( newsocket );
  256. return -1;
  257. } //end if
  258. return newsocket;
  259. } //end of the function WINS_OpenSocket
  260. //===========================================================================
  261. //
  262. // Parameter: -
  263. // Returns: -
  264. // Changes Globals: -
  265. //===========================================================================
  266. int WINS_OpenReliableSocket( int port ){
  267. int newsocket;
  268. struct sockaddr_in address;
  269. qboolean _true = 0xFFFFFFFF;
  270. //IPPROTO_TCP
  271. //
  272. if ( ( newsocket = socket( AF_INET, SOCK_STREAM, 0 ) ) == -1 ) {
  273. WinPrint( "WINS_OpenReliableSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  274. return -1;
  275. } //end if
  276. memset( (char *) &address, 0, sizeof( address ) );
  277. address.sin_family = AF_INET;
  278. address.sin_addr.s_addr = htonl( INADDR_ANY );
  279. address.sin_port = htons( (u_short)port );
  280. if ( bind( newsocket, (void *)&address, sizeof( address ) ) == -1 ) {
  281. WinPrint( "WINS_OpenReliableSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  282. closesocket( newsocket );
  283. return -1;
  284. } //end if
  285. //
  286. if ( setsockopt( newsocket, IPPROTO_TCP, TCP_NODELAY, (void *) &_true, sizeof( int ) ) == -1 ) {
  287. WinPrint( "WINS_OpenReliableSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  288. WinPrint( "setsockopt error\n" );
  289. } //end if
  290. return newsocket;
  291. } //end of the function WINS_OpenReliableSocket
  292. //===========================================================================
  293. //
  294. // Parameter: -
  295. // Returns: -
  296. // Changes Globals: -
  297. //===========================================================================
  298. int WINS_Listen( int socket ){
  299. u_long _true = 1;
  300. if ( ioctlsocket( socket, FIONBIO, &_true ) == -1 ) {
  301. WinPrint( "WINS_Listen: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  302. return -1;
  303. } //end if
  304. if ( listen( socket, SOMAXCONN ) == SOCKET_ERROR ) {
  305. WinPrint( "WINS_Listen: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  306. return -1;
  307. } //end if
  308. return 0;
  309. } //end of the function WINS_Listen
  310. //===========================================================================
  311. //
  312. // Parameter: -
  313. // Returns: -
  314. // Changes Globals: -
  315. //===========================================================================
  316. int WINS_Accept( int socket, struct sockaddr_s *addr ){
  317. socklen_t addrlen = sizeof( struct sockaddr_s );
  318. int newsocket;
  319. qboolean _true = 1;
  320. newsocket = accept( socket, (struct sockaddr *)addr, &addrlen );
  321. if ( newsocket == INVALID_SOCKET ) {
  322. if ( errno == EAGAIN ) {
  323. return -1;
  324. }
  325. WinPrint( "WINS_Accept: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  326. return -1;
  327. } //end if
  328. //
  329. if ( setsockopt( newsocket, IPPROTO_TCP, TCP_NODELAY, (void *) &_true, sizeof( int ) ) == SOCKET_ERROR ) {
  330. WinPrint( "WINS_Accept: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  331. WinPrint( "setsockopt error\n" );
  332. } //end if
  333. return newsocket;
  334. } //end of the function WINS_Accept
  335. //===========================================================================
  336. //
  337. // Parameter: -
  338. // Returns: -
  339. // Changes Globals: -
  340. //===========================================================================
  341. int WINS_CloseSocket( int socket ){
  342. /*
  343. if (socket == net_broadcastsocket)
  344. net_broadcastsocket = 0;
  345. */
  346. // shutdown(socket, SD_SEND);
  347. if ( closesocket( socket ) == SOCKET_ERROR ) {
  348. WinPrint( "WINS_CloseSocket: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  349. return SOCKET_ERROR;
  350. } //end if
  351. return 0;
  352. } //end of the function WINS_CloseSocket
  353. //===========================================================================
  354. // this lets you type only as much of the net address as required, using
  355. // the local network components to fill in the rest
  356. //
  357. // Parameter: -
  358. // Returns: -
  359. // Changes Globals: -
  360. //===========================================================================
  361. static int PartialIPAddress( char *in, struct sockaddr_s *hostaddr ){
  362. char buff[256];
  363. char *b;
  364. int addr;
  365. int num;
  366. int mask;
  367. buff[0] = '.';
  368. b = buff;
  369. strcpy( buff + 1, in );
  370. if ( buff[1] == '.' ) {
  371. b++;
  372. }
  373. addr = 0;
  374. mask = -1;
  375. while ( *b == '.' )
  376. {
  377. num = 0;
  378. if ( *++b < '0' || *b > '9' ) {
  379. return -1;
  380. }
  381. while ( !( *b < '0' || *b > '9' ) )
  382. num = num * 10 + *( b++ ) - '0';
  383. mask <<= 8;
  384. addr = ( addr << 8 ) + num;
  385. }
  386. hostaddr->sa_family = AF_INET;
  387. ( (struct sockaddr_in *)hostaddr )->sin_port = htons( (u_short)net_hostport );
  388. ( (struct sockaddr_in *)hostaddr )->sin_addr.s_addr = ( myAddr & htonl( mask ) ) | htonl( addr );
  389. return 0;
  390. } //end of the function PartialIPAddress
  391. //===========================================================================
  392. //
  393. // Parameter: -
  394. // Returns: -
  395. // Changes Globals: -
  396. //===========================================================================
  397. int WINS_Connect( int socket, struct sockaddr_s *addr ){
  398. int ret;
  399. u_long _true2 = 0xFFFFFFFF;
  400. ret = connect( socket, (struct sockaddr *)addr, sizeof( struct sockaddr_s ) );
  401. if ( ret == SOCKET_ERROR ) {
  402. WinPrint( "WINS_Connect: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  403. return -1;
  404. } //end if
  405. if ( ioctlsocket( socket, FIONBIO, &_true2 ) == -1 ) {
  406. WinPrint( "WINS_Connect: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  407. return -1;
  408. } //end if
  409. return 0;
  410. } //end of the function WINS_Connect
  411. //===========================================================================
  412. //
  413. // Parameter: -
  414. // Returns: -
  415. // Changes Globals: -
  416. //===========================================================================
  417. int WINS_CheckNewConnections( void ){
  418. char buf[4];
  419. if ( net_acceptsocket == -1 ) {
  420. return -1;
  421. }
  422. if ( recvfrom( net_acceptsocket, buf, 4, MSG_PEEK, NULL, NULL ) > 0 ) {
  423. return net_acceptsocket;
  424. }
  425. return -1;
  426. } //end of the function WINS_CheckNewConnections
  427. //===========================================================================
  428. // returns the number of bytes read
  429. // 0 if no bytes available
  430. // -1 on failure
  431. //
  432. // Parameter: -
  433. // Returns: -
  434. // Changes Globals: -
  435. //===========================================================================
  436. int WINS_Read( int socket, byte *buf, int len, struct sockaddr_s *addr ){
  437. socklen_t addrlen = sizeof( struct sockaddr_s );
  438. int ret;
  439. if ( addr ) {
  440. ret = recvfrom( socket, buf, len, 0, (struct sockaddr *)addr, &addrlen );
  441. if ( ret == -1 ) {
  442. // errno = WSAGetLastError();
  443. if ( errno == EAGAIN || errno == ENOTCONN ) {
  444. return 0;
  445. }
  446. } //end if
  447. } //end if
  448. else
  449. {
  450. ret = recv( socket, buf, len, 0 );
  451. // if there's no data on the socket ret == -1 and errno == EAGAIN
  452. // MSDN states that if ret == 0 the socket has been closed
  453. // man recv doesn't say anything
  454. if ( ret == 0 ) {
  455. return -1;
  456. }
  457. if ( ret == SOCKET_ERROR ) {
  458. // errno = WSAGetLastError();
  459. if ( errno == EAGAIN || errno == ENOTCONN ) {
  460. return 0;
  461. }
  462. } //end if
  463. } //end else
  464. if ( ret == SOCKET_ERROR ) {
  465. WinPrint( "WINS_Read: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  466. } //end if
  467. return ret;
  468. } //end of the function WINS_Read
  469. //===========================================================================
  470. //
  471. // Parameter: -
  472. // Returns: -
  473. // Changes Globals: -
  474. //===========================================================================
  475. int WINS_MakeSocketBroadcastCapable( int socket ){
  476. int i = 1;
  477. // make this socket broadcast capable
  478. if ( setsockopt( socket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof( i ) ) < 0 ) {
  479. return -1;
  480. }
  481. net_broadcastsocket = socket;
  482. return 0;
  483. } //end of the function WINS_MakeSocketBroadcastCapable
  484. //===========================================================================
  485. //
  486. // Parameter: -
  487. // Returns: -
  488. // Changes Globals: -
  489. //===========================================================================
  490. int WINS_Broadcast( int socket, byte *buf, int len ){
  491. int ret;
  492. if ( socket != net_broadcastsocket ) {
  493. if ( net_broadcastsocket != 0 ) {
  494. WinError( "Attempted to use multiple broadcasts sockets\n" );
  495. }
  496. ret = WINS_MakeSocketBroadcastCapable( socket );
  497. if ( ret == -1 ) {
  498. WinPrint( "Unable to make socket broadcast capable\n" );
  499. return ret;
  500. }
  501. }
  502. return WINS_Write( socket, buf, len, &broadcastaddr );
  503. } //end of the function WINS_Broadcast
  504. //===========================================================================
  505. // returns qtrue on success or qfalse on failure
  506. //
  507. // Parameter: -
  508. // Returns: -
  509. // Changes Globals: -
  510. //===========================================================================
  511. int WINS_Write( int socket, byte *buf, int len, struct sockaddr_s *addr ){
  512. int ret, written;
  513. ret = 0;
  514. if ( addr ) {
  515. written = 0;
  516. while ( written < len )
  517. {
  518. ret = sendto( socket, &buf[written], len - written, 0, (struct sockaddr *)addr, sizeof( struct sockaddr_s ) );
  519. if ( ret == SOCKET_ERROR ) {
  520. if ( WSAGetLastError() != EAGAIN ) {
  521. return qfalse;
  522. }
  523. //++timo FIXME: what is this used for?
  524. // Sleep(1000);
  525. } //end if
  526. else
  527. {
  528. written += ret;
  529. }
  530. }
  531. } //end if
  532. else
  533. {
  534. written = 0;
  535. while ( written < len )
  536. {
  537. ret = send( socket, buf, len, 0 );
  538. if ( ret == SOCKET_ERROR ) {
  539. if ( WSAGetLastError() != EAGAIN ) {
  540. return qfalse;
  541. }
  542. //++timo FIXME: what is this used for?
  543. // Sleep(1000);
  544. } //end if
  545. else
  546. {
  547. written += ret;
  548. }
  549. }
  550. } //end else
  551. if ( ret == SOCKET_ERROR ) {
  552. WinPrint( "WINS_Write: %s\n", WINS_ErrorMessage( WSAGetLastError() ) );
  553. } //end if
  554. return ( ret == len );
  555. } //end of the function WINS_Write
  556. //===========================================================================
  557. //
  558. // Parameter: -
  559. // Returns: -
  560. // Changes Globals: -
  561. //===========================================================================
  562. char *WINS_AddrToString( struct sockaddr_s *addr ){
  563. static char buffer[22];
  564. int haddr;
  565. haddr = ntohl( ( (struct sockaddr_in *)addr )->sin_addr.s_addr );
  566. sprintf( buffer, "%d.%d.%d.%d:%d", ( haddr >> 24 ) & 0xff, ( haddr >> 16 ) & 0xff, ( haddr >> 8 ) & 0xff, haddr & 0xff, ntohs( ( (struct sockaddr_in *)addr )->sin_port ) );
  567. return buffer;
  568. } //end of the function WINS_AddrToString
  569. //===========================================================================
  570. //
  571. // Parameter: -
  572. // Returns: -
  573. // Changes Globals: -
  574. //===========================================================================
  575. int WINS_StringToAddr( char *string, struct sockaddr_s *addr ){
  576. int ha1, ha2, ha3, ha4, hp;
  577. int ipaddr;
  578. sscanf( string, "%d.%d.%d.%d:%d", &ha1, &ha2, &ha3, &ha4, &hp );
  579. ipaddr = ( ha1 << 24 ) | ( ha2 << 16 ) | ( ha3 << 8 ) | ha4;
  580. addr->sa_family = AF_INET;
  581. ( (struct sockaddr_in *)addr )->sin_addr.s_addr = htonl( ipaddr );
  582. ( (struct sockaddr_in *)addr )->sin_port = htons( (u_short)hp );
  583. return 0;
  584. } //end of the function WINS_StringToAddr
  585. //===========================================================================
  586. //
  587. // Parameter: -
  588. // Returns: -
  589. // Changes Globals: -
  590. //===========================================================================
  591. int WINS_GetSocketAddr( int socket, struct sockaddr_s *addr ){
  592. socklen_t addrlen = sizeof( struct sockaddr_s );
  593. unsigned int a;
  594. memset( addr, 0, sizeof( struct sockaddr_s ) );
  595. getsockname( socket, (struct sockaddr *)addr, &addrlen );
  596. a = ( (struct sockaddr_in *)addr )->sin_addr.s_addr;
  597. if ( a == 0 || a == inet_addr( "127.0.0.1" ) ) {
  598. ( (struct sockaddr_in *)addr )->sin_addr.s_addr = myAddr;
  599. }
  600. return 0;
  601. } //end of the function WINS_GetSocketAddr
  602. //===========================================================================
  603. //
  604. // Parameter: -
  605. // Returns: -
  606. // Changes Globals: -
  607. //===========================================================================
  608. int WINS_GetNameFromAddr( struct sockaddr_s *addr, char *name ){
  609. struct hostent *hostentry;
  610. hostentry = gethostbyaddr( (char *)&( (struct sockaddr_in *)addr )->sin_addr, sizeof( struct in_addr ), AF_INET );
  611. if ( hostentry ) {
  612. strncpy( name, (char *)hostentry->h_name, NET_NAMELEN - 1 );
  613. return 0;
  614. }
  615. strcpy( name, WINS_AddrToString( addr ) );
  616. return 0;
  617. } //end of the function WINS_GetNameFromAddr
  618. //===========================================================================
  619. //
  620. // Parameter: -
  621. // Returns: -
  622. // Changes Globals: -
  623. //===========================================================================
  624. int WINS_GetAddrFromName( char *name, struct sockaddr_s *addr ){
  625. struct hostent *hostentry;
  626. if ( name[0] >= '0' && name[0] <= '9' ) {
  627. return PartialIPAddress( name, addr );
  628. }
  629. hostentry = gethostbyname( name );
  630. if ( !hostentry ) {
  631. return -1;
  632. }
  633. addr->sa_family = AF_INET;
  634. ( (struct sockaddr_in *)addr )->sin_port = htons( (u_short)net_hostport );
  635. ( (struct sockaddr_in *)addr )->sin_addr.s_addr = *(int *)hostentry->h_addr_list[0];
  636. return 0;
  637. } //end of the function WINS_GetAddrFromName
  638. //===========================================================================
  639. //
  640. // Parameter: -
  641. // Returns: -
  642. // Changes Globals: -
  643. //===========================================================================
  644. int WINS_AddrCompare( struct sockaddr_s *addr1, struct sockaddr_s *addr2 ){
  645. if ( addr1->sa_family != addr2->sa_family ) {
  646. return -1;
  647. }
  648. if ( ( (struct sockaddr_in *)addr1 )->sin_addr.s_addr != ( (struct sockaddr_in *)addr2 )->sin_addr.s_addr ) {
  649. return -1;
  650. }
  651. if ( ( (struct sockaddr_in *)addr1 )->sin_port != ( (struct sockaddr_in *)addr2 )->sin_port ) {
  652. return 1;
  653. }
  654. return 0;
  655. } //end of the function WINS_AddrCompare
  656. //===========================================================================
  657. //
  658. // Parameter: -
  659. // Returns: -
  660. // Changes Globals: -
  661. //===========================================================================
  662. int WINS_GetSocketPort( struct sockaddr_s *addr ){
  663. return ntohs( ( (struct sockaddr_in *)addr )->sin_port );
  664. } //end of the function WINS_GetSocketPort
  665. //===========================================================================
  666. //
  667. // Parameter: -
  668. // Returns: -
  669. // Changes Globals: -
  670. //===========================================================================
  671. int WINS_SetSocketPort( struct sockaddr_s *addr, int port ){
  672. ( (struct sockaddr_in *)addr )->sin_port = htons( (u_short)port );
  673. return 0;
  674. } //end of the function WINS_SetSocketPort