1 /* ------------------------------------------------------------------------- 
   2  * Project:     GSocket (Generic Socket) for WX 
   4  * Copyright:   (c) Guilhem Lavaux 
   5  * Licence:     wxWindows Licence 
   6  * Authors:     David Elliott (C++ conversion, maintainer) 
   8  *              Guillermo Rodriguez Garcia <guille@iies.es> 
   9  * Purpose:     GSocket main Unix and OS/2 file 
  10  * Licence:     The wxWindows licence 
  12  * ------------------------------------------------------------------------- 
  15 #if defined(__WATCOMC__) 
  16 #include "wx/wxprec.h" 
  21 #ifndef __GSOCKET_STANDALONE__ 
  23 #include "wx/private/gsocketiohandler.h" 
  26 #if defined(__VISAGECPP__) 
  27 #define BSD_SELECT /* use Berkeley Sockets select */ 
  30 #if wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) 
  33 #include <sys/types.h> 
  38 #include <netinet/in.h> 
  41 #include <sys/ioctl.h> 
  43 #ifdef HAVE_SYS_SELECT_H 
  44 #   include <sys/select.h> 
  51     u_char  sun_len
;        /* sockaddr len including null */ 
  52     u_char  sun_family
;     /* AF_UNIX */ 
  53     char    sun_path
[108];  /* path name (gag) */ 
  56 #include <sys/socket.h> 
  62 #include <netinet/in.h> 
  63 #include <arpa/inet.h> 
  70 #include <machine/endian.h> 
  76 #define EBADF   SOCEBADF 
  82 #include <sys/socket.h> 
  83 #include <sys/ioctl.h> 
  84 #include <sys/select.h> 
  86 #define close(a) soclose(a) 
  87 #define select(a,b,c,d,e) bsdselect(a,b,c,d,e) 
  88 int _System 
bsdselect(int, 
  93 int _System 
soclose(int); 
  97 #include <sys/select.h> 
 105 #  include <sys/filio.h> 
 108 #  include <bstring.h> 
 111 #  include <strings.h> 
 118 #  define WX_SOCKLEN_T unsigned int 
 122 #      define WX_SOCKLEN_T socklen_t 
 124 #  elif defined(__WXMAC__) 
 125 #    define WX_SOCKLEN_T socklen_t 
 127 #    define WX_SOCKLEN_T int 
 131 #endif /* SOCKLEN_T */ 
 134 #define SOCKOPTLEN_T WX_SOCKLEN_T 
 138  * MSW defines this, Unices don't. 
 140 #ifndef INVALID_SOCKET 
 141 #define INVALID_SOCKET -1 
 144 /* UnixWare reportedly needs this for FIONBIO definition */ 
 146 #include <sys/filio.h> 
 150  * INADDR_BROADCAST is identical to INADDR_NONE which is not defined 
 151  * on all systems. INADDR_BROADCAST should be fine to indicate an error. 
 154 #define INADDR_NONE INADDR_BROADCAST 
 157 #if defined(__VISAGECPP__) || defined(__WATCOMC__) 
 159     #define MASK_SIGNAL() { 
 160     #define UNMASK_SIGNAL() } 
 163     extern "C" { typedef void (*wxSigHandler
)(int); } 
 165     #define MASK_SIGNAL()                       \ 
 167         wxSigHandler old_handler = signal(SIGPIPE, SIG_IGN); 
 169     #define UNMASK_SIGNAL()                     \ 
 170         signal(SIGPIPE, old_handler);           \ 
 175 /* If a SIGPIPE is issued by a socket call on a remotely closed socket, 
 176    the program will "crash" unless it explicitly handles the SIGPIPE. 
 177    By using MSG_NOSIGNAL, the SIGPIPE is suppressed. Later, we will 
 178    use SO_NOSIGPIPE (if available), the BSD equivalent. */ 
 180 #  define GSOCKET_MSG_NOSIGNAL MSG_NOSIGNAL 
 181 #else /* MSG_NOSIGNAL not available (FreeBSD including OS X) */ 
 182 #  define GSOCKET_MSG_NOSIGNAL 0 
 183 #endif /* MSG_NOSIGNAL */ 
 185 #ifndef __GSOCKET_STANDALONE__ 
 186 #  include "wx/unix/gsockunx.h" 
 187 #  include "wx/unix/private.h" 
 188 #  include "wx/gsocket.h" 
 189 #if wxUSE_THREADS && (defined(HAVE_GETHOSTBYNAME) || defined(HAVE_GETSERVBYNAME)) 
 190 #  include "wx/thread.h" 
 193 #  include "gsockunx.h" 
 194 #  include "gsocket.h" 
 198 #endif /* __GSOCKET_STANDALONE__ */ 
 200 #if defined(HAVE_GETHOSTBYNAME) 
 201 static struct hostent 
* deepCopyHostent(struct hostent 
*h
, 
 202                                         const struct hostent 
*he
, 
 203                                         char *buffer
, int size
, int *err
) 
 205   /* copy old structure */ 
 206   memcpy(h
, he
, sizeof(struct hostent
)); 
 209   int len 
= strlen(h
->h_name
); 
 215   memcpy(buffer
, h
->h_name
, len
); 
 219   /* track position in the buffer */ 
 222   /* reuse len to store address length */ 
 225   /* ensure pointer alignment */ 
 226   unsigned int misalign 
= sizeof(char *) - pos%sizeof
(char *); 
 227   if(misalign 
< sizeof(char *)) 
 230   /* leave space for pointer list */ 
 231   char **p 
= h
->h_addr_list
, **q
; 
 232   char **h_addr_list 
= (char **)(buffer 
+ pos
); 
 234     pos 
+= sizeof(char *); 
 236   /* copy addresses and fill new pointer list */ 
 237   for (p 
= h
->h_addr_list
, q 
= h_addr_list
; *p 
!= 0; p
++, q
++) 
 239     if (size 
< pos 
+ len
) 
 244     memcpy(buffer 
+ pos
, *p
, len
); /* copy content */ 
 245     *q 
= buffer 
+ pos
; /* set copied pointer to copied content */ 
 248   *++q 
= 0; /* null terminate the pointer list */ 
 249   h
->h_addr_list 
= h_addr_list
; /* copy pointer to pointers */ 
 251   /* ensure word alignment of pointers */ 
 252   misalign 
= sizeof(char *) - pos%sizeof
(char *); 
 253   if(misalign 
< sizeof(char *)) 
 256   /* leave space for pointer list */ 
 258   char **h_aliases 
= (char **)(buffer 
+ pos
); 
 260     pos 
+= sizeof(char *); 
 262   /* copy aliases and fill new pointer list */ 
 263   for (p 
= h
->h_aliases
, q 
= h_aliases
; *p 
!= 0; p
++, q
++) 
 266     if (size 
<= pos 
+ len
) 
 271     memcpy(buffer 
+ pos
, *p
, len
); /* copy content */ 
 272     buffer
[pos 
+ len
] = '\0'; 
 273     *q 
= buffer 
+ pos
; /* set copied pointer to copied content */ 
 276   *++q 
= 0; /* null terminate the pointer list */ 
 277   h
->h_aliases 
= h_aliases
; /* copy pointer to pointers */ 
 283 #if defined(HAVE_GETHOSTBYNAME) && wxUSE_THREADS 
 284 static wxMutex nameLock
; 
 286 struct hostent 
* wxGethostbyname_r(const char *hostname
, struct hostent 
*h
, 
 287                                    void *buffer
, int size
, int *err
) 
 290   struct hostent 
*he 
= NULL
; 
 292 #if defined(HAVE_FUNC_GETHOSTBYNAME_R_6) 
 293   if (gethostbyname_r(hostname
, h
, (char*)buffer
, size
, &he
, err
)) 
 295 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5) 
 296   he 
= gethostbyname_r(hostname
, h
, (char*)buffer
, size
, err
); 
 297 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_3) 
 298   if (gethostbyname_r(hostname
, h
, (struct hostent_data
*) buffer
)) 
 305 #elif defined(HAVE_GETHOSTBYNAME) 
 307   wxMutexLocker 
locker(nameLock
); 
 309   he 
= gethostbyname(hostname
); 
 313     he 
= deepCopyHostent(h
, he
, (char*)buffer
, size
, err
); 
 318 #if defined(HAVE_GETHOSTBYNAME) && wxUSE_THREADS 
 319 static wxMutex addrLock
; 
 321 struct hostent 
* wxGethostbyaddr_r(const char *addr_buf
, int buf_size
, 
 322                                    int proto
, struct hostent 
*h
, 
 323                                    void *buffer
, int size
, int *err
) 
 325   struct hostent 
*he 
= NULL
; 
 327 #if defined(HAVE_FUNC_GETHOSTBYNAME_R_6) 
 328   if (gethostbyaddr_r(addr_buf
, buf_size
, proto
, h
, 
 329                       (char*)buffer
, size
, &he
, err
)) 
 331 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_5) 
 332   he 
= gethostbyaddr_r(addr_buf
, buf_size
, proto
, h
, (char*)buffer
, size
, err
); 
 333 #elif defined(HAVE_FUNC_GETHOSTBYNAME_R_3) 
 334   if (gethostbyaddr_r(addr_buf
, buf_size
, proto
, h
, 
 335                         (struct hostent_data
*) buffer
)) 
 342 #elif defined(HAVE_GETHOSTBYNAME) 
 344   wxMutexLocker 
locker(addrLock
); 
 346   he 
= gethostbyaddr(addr_buf
, buf_size
, proto
); 
 350     he 
= deepCopyHostent(h
, he
, (char*)buffer
, size
, err
); 
 355 #if defined(HAVE_GETSERVBYNAME) 
 356 static struct servent 
* deepCopyServent(struct servent 
*s
, 
 357                                         const struct servent 
*se
, 
 358                                         char *buffer
, int size
) 
 360   /* copy plain old structure */ 
 361   memcpy(s
, se
, sizeof(struct servent
)); 
 364   int len 
= strlen(s
->s_name
); 
 369   memcpy(buffer
, s
->s_name
, len
); 
 373   /* track position in the buffer */ 
 377   len 
= strlen(s
->s_proto
); 
 378   if (pos 
+ len 
>= size
) 
 382   memcpy(buffer 
+ pos
, s
->s_proto
, len
); 
 383   buffer
[pos 
+ len
] = '\0'; 
 384   s
->s_proto 
= buffer 
+ pos
; 
 386   /* track position in the buffer */ 
 389   /* ensure pointer alignment */ 
 390   unsigned int misalign 
= sizeof(char *) - pos%sizeof
(char *); 
 391   if(misalign 
< sizeof(char *)) 
 394   /* leave space for pointer list */ 
 395   char **p 
= s
->s_aliases
, **q
; 
 396   char **s_aliases 
= (char **)(buffer 
+ pos
); 
 398     pos 
+= sizeof(char *); 
 400   /* copy addresses and fill new pointer list */ 
 401   for (p 
= s
->s_aliases
, q 
= s_aliases
; *p 
!= 0; p
++, q
++){ 
 403     if (size 
<= pos 
+ len
) 
 407     memcpy(buffer 
+ pos
, *p
, len
); /* copy content */ 
 408     buffer
[pos 
+ len
] = '\0'; 
 409     *q 
= buffer 
+ pos
; /* set copied pointer to copied content */ 
 412   *++q 
= 0; /* null terminate the pointer list */ 
 413   s
->s_aliases 
= s_aliases
; /* copy pointer to pointers */ 
 418 #if defined(HAVE_GETSERVBYNAME) && wxUSE_THREADS 
 419 static wxMutex servLock
; 
 421 struct servent 
*wxGetservbyname_r(const char *port
, const char *protocol
, 
 422                                   struct servent 
*serv
, void *buffer
, int size
) 
 424   struct servent 
*se 
= NULL
; 
 425 #if defined(HAVE_FUNC_GETSERVBYNAME_R_6) 
 426   if (getservbyname_r(port
, protocol
, serv
, (char*)buffer
, size
, &se
)) 
 428 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_5) 
 429   se 
= getservbyname_r(port
, protocol
, serv
, (char*)buffer
, size
); 
 430 #elif defined(HAVE_FUNC_GETSERVBYNAME_R_4) 
 431   if (getservbyname_r(port
, protocol
, serv
, (struct servent_data
*) buffer
)) 
 435 #elif defined(HAVE_GETSERVBYNAME) 
 437   wxMutexLocker 
locker(servLock
); 
 439   se 
= getservbyname(port
, protocol
); 
 441     se 
= deepCopyServent(serv
, se
, (char*)buffer
, size
); 
 446 /* debugging helpers */ 
 447 #ifdef __GSOCKET_DEBUG__ 
 448 #  define GSocket_Debug(args) printf args 
 450 #  define GSocket_Debug(args) 
 451 #endif /* __GSOCKET_DEBUG__ */ 
 453 /* Table of GUI-related functions. We must call them indirectly because 
 454  * of wxBase and GUI separation: */ 
 456 static GSocketGUIFunctionsTable 
*gs_gui_functions
; 
 458 class GSocketGUIFunctionsTableNull
: public GSocketGUIFunctionsTable
 
 461     virtual bool OnInit(); 
 462     virtual void OnExit(); 
 463     virtual bool CanUseEventLoop(); 
 464     virtual bool Init_Socket(GSocket 
*socket
); 
 465     virtual void Destroy_Socket(GSocket 
*socket
); 
 466     virtual void Install_Callback(GSocket 
*socket
, GSocketEvent event
); 
 467     virtual void Uninstall_Callback(GSocket 
*socket
, GSocketEvent event
); 
 468     virtual void Enable_Events(GSocket 
*socket
); 
 469     virtual void Disable_Events(GSocket 
*socket
); 
 472 bool GSocketGUIFunctionsTableNull::OnInit() 
 474 void GSocketGUIFunctionsTableNull::OnExit() 
 476 bool GSocketGUIFunctionsTableNull::CanUseEventLoop() 
 478 bool GSocketGUIFunctionsTableNull::Init_Socket(GSocket 
*WXUNUSED(socket
)) 
 480 void GSocketGUIFunctionsTableNull::Destroy_Socket(GSocket 
*WXUNUSED(socket
)) 
 482 void GSocketGUIFunctionsTableNull::Install_Callback(GSocket 
*WXUNUSED(socket
), GSocketEvent 
WXUNUSED(event
)) 
 484 void GSocketGUIFunctionsTableNull::Uninstall_Callback(GSocket 
*WXUNUSED(socket
), GSocketEvent 
WXUNUSED(event
)) 
 486 void GSocketGUIFunctionsTableNull::Enable_Events(GSocket 
*WXUNUSED(socket
)) 
 488 void GSocketGUIFunctionsTableNull::Disable_Events(GSocket 
*WXUNUSED(socket
)) 
 490 /* Global initialisers */ 
 492 void GSocket_SetGUIFunctions(GSocketGUIFunctionsTable 
*guifunc
) 
 494   gs_gui_functions 
= guifunc
; 
 497 int GSocket_Init(void) 
 499   if (!gs_gui_functions
) 
 501     static GSocketGUIFunctionsTableNull table
; 
 502     gs_gui_functions 
= &table
; 
 504   if ( !gs_gui_functions
->OnInit() ) 
 509 void GSocket_Cleanup(void) 
 511   if (gs_gui_functions
) 
 513       gs_gui_functions
->OnExit(); 
 517 /* Constructors / Destructors for GSocket */ 
 523   m_fd                  
= INVALID_SOCKET
; 
 526   for (i
=0;i
<GSOCK_MAX_EVENT
;i
++) 
 533   m_error               
= GSOCK_NOERROR
; 
 536   m_gui_dependent       
= NULL
; 
 537   m_non_blocking        
= false; 
 541   m_timeout             
= 10*60*1000; 
 542                                 /* 10 minutes * 60 sec * 1000 millisec */ 
 543   m_establishing        
= false; 
 545   assert(gs_gui_functions
); 
 546   /* Per-socket GUI-specific initialization */ 
 547   m_ok 
= gs_gui_functions
->Init_Socket(this); 
 550 void GSocket::Close() 
 552     gs_gui_functions
->Disable_Events(this); 
 553     /* gsockosx.c calls CFSocketInvalidate which closes the socket for us */ 
 554 #if !(defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))) 
 557     m_fd 
= INVALID_SOCKET
; 
 564   /* Check that the socket is really shutdowned */ 
 565   if (m_fd 
!= INVALID_SOCKET
) 
 568   /* Per-socket GUI-specific cleanup */ 
 569   gs_gui_functions
->Destroy_Socket(this); 
 573   /* Destroy private addresses */ 
 575     GAddress_destroy(m_local
); 
 578     GAddress_destroy(m_peer
); 
 582  *  Disallow further read/write operations on this socket, close 
 583  *  the fd and disable all callbacks. 
 585 void GSocket::Shutdown() 
 591   /* Don't allow events to fire after socket has been closed */ 
 592   gs_gui_functions
->Disable_Events(this); 
 594   /* If socket has been created, shutdown it */ 
 595   if (m_fd 
!= INVALID_SOCKET
) 
 601   /* Disable GUI callbacks */ 
 602   for (evt 
= 0; evt 
< GSOCK_MAX_EVENT
; evt
++) 
 603     m_cbacks
[evt
] = NULL
; 
 605   m_detected 
= GSOCK_LOST_FLAG
; 
 608 /* Address handling */ 
 614  *  Set or get the local or peer address for this socket. The 'set' 
 615  *  functions return GSOCK_NOERROR on success, an error code otherwise. 
 616  *  The 'get' functions return a pointer to a GAddress object on success, 
 617  *  or NULL otherwise, in which case they set the error code of the 
 618  *  corresponding GSocket. 
 621  *    GSOCK_INVSOCK - the socket is not valid. 
 622  *    GSOCK_INVADDR - the address is not valid. 
 624 GSocketError 
GSocket::SetLocal(GAddress 
*address
) 
 628   /* the socket must be initialized, or it must be a server */ 
 629   if ((m_fd 
!= INVALID_SOCKET 
&& !m_server
)) 
 631     m_error 
= GSOCK_INVSOCK
; 
 632     return GSOCK_INVSOCK
; 
 636   if (address 
== NULL 
|| address
->m_family 
== GSOCK_NOFAMILY
) 
 638     m_error 
= GSOCK_INVADDR
; 
 639     return GSOCK_INVADDR
; 
 643     GAddress_destroy(m_local
); 
 645   m_local 
= GAddress_copy(address
); 
 647   return GSOCK_NOERROR
; 
 650 GSocketError 
GSocket::SetPeer(GAddress 
*address
) 
 655   if (address 
== NULL 
|| address
->m_family 
== GSOCK_NOFAMILY
) 
 657     m_error 
= GSOCK_INVADDR
; 
 658     return GSOCK_INVADDR
; 
 662     GAddress_destroy(m_peer
); 
 664   m_peer 
= GAddress_copy(address
); 
 666   return GSOCK_NOERROR
; 
 669 GAddress 
*GSocket::GetLocal() 
 672   struct sockaddr addr
; 
 673   WX_SOCKLEN_T size 
= sizeof(addr
); 
 678   /* try to get it from the m_local var first */ 
 680     return GAddress_copy(m_local
); 
 682   /* else, if the socket is initialized, try getsockname */ 
 683   if (m_fd 
== INVALID_SOCKET
) 
 685     m_error 
= GSOCK_INVSOCK
; 
 689   if (getsockname(m_fd
, &addr
, (WX_SOCKLEN_T 
*) &size
) < 0) 
 691     m_error 
= GSOCK_IOERR
; 
 695   /* got a valid address from getsockname, create a GAddress object */ 
 696   address 
= GAddress_new(); 
 699     m_error 
= GSOCK_MEMERR
; 
 703   err 
= _GAddress_translate_from(address
, &addr
, size
); 
 704   if (err 
!= GSOCK_NOERROR
) 
 706     GAddress_destroy(address
); 
 714 GAddress 
*GSocket::GetPeer() 
 718   /* try to get it from the m_peer var */ 
 720     return GAddress_copy(m_peer
); 
 725 /* Server specific parts */ 
 727 /* GSocket_SetServer: 
 728  *  Sets up this socket as a server. The local address must have been 
 729  *  set with GSocket_SetLocal() before GSocket_SetServer() is called. 
 730  *  Returns GSOCK_NOERROR on success, one of the following otherwise: 
 733  *    GSOCK_INVSOCK - the socket is in use. 
 734  *    GSOCK_INVADDR - the local address has not been set. 
 735  *    GSOCK_IOERR   - low-level error. 
 737 GSocketError 
GSocket::SetServer() 
 743   /* must not be in use */ 
 744   if (m_fd 
!= INVALID_SOCKET
) 
 746     m_error 
= GSOCK_INVSOCK
; 
 747     return GSOCK_INVSOCK
; 
 750   /* the local addr must have been set */ 
 753     m_error 
= GSOCK_INVADDR
; 
 754     return GSOCK_INVADDR
; 
 757   /* Initialize all fields */ 
 761   /* Create the socket */ 
 762   m_fd 
= socket(m_local
->m_realfamily
, SOCK_STREAM
, 0); 
 764   if (m_fd 
== INVALID_SOCKET
) 
 766     m_error 
= GSOCK_IOERR
; 
 770   /* FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option */ 
 772   setsockopt(m_fd
, SOL_SOCKET
, SO_NOSIGPIPE
, (const char*)&arg
, sizeof(arg
)); 
 775   ioctl(m_fd
, FIONBIO
, &arg
); 
 776   gs_gui_functions
->Enable_Events(this); 
 778   /* allow a socket to re-bind if the socket is in the TIME_WAIT 
 779      state after being previously closed. 
 783     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEADDR
, (const char*)&arg
, sizeof(arg
)); 
 785     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEPORT
, (const char*)&arg
, sizeof(arg
)); 
 789   /* Bind to the local address, 
 790    * retrieve the actual address bound, 
 791    * and listen up to 5 connections. 
 793   if ((bind(m_fd
, m_local
->m_addr
, m_local
->m_len
) != 0) || 
 796                    (WX_SOCKLEN_T 
*) &m_local
->m_len
) != 0) || 
 797       (listen(m_fd
, 5) != 0)) 
 800     m_error 
= GSOCK_IOERR
; 
 804   return GSOCK_NOERROR
; 
 807 /* GSocket_WaitConnection: 
 808  *  Waits for an incoming client connection. Returns a pointer to 
 809  *  a GSocket object, or NULL if there was an error, in which case 
 810  *  the last error field will be updated for the calling GSocket. 
 812  *  Error codes (set in the calling GSocket) 
 813  *    GSOCK_INVSOCK    - the socket is not valid or not a server. 
 814  *    GSOCK_TIMEDOUT   - timeout, no incoming connections. 
 815  *    GSOCK_WOULDBLOCK - the call would block and the socket is nonblocking. 
 816  *    GSOCK_MEMERR     - couldn't allocate memory. 
 817  *    GSOCK_IOERR      - low-level error. 
 819 GSocket 
*GSocket::WaitConnection() 
 821   struct sockaddr from
; 
 822   WX_SOCKLEN_T fromlen 
= sizeof(from
); 
 829   /* If the socket has already been created, we exit immediately */ 
 830   if (m_fd 
== INVALID_SOCKET 
|| !m_server
) 
 832     m_error 
= GSOCK_INVSOCK
; 
 836   /* Create a GSocket object for the new connection */ 
 837   connection 
= GSocket_new(); 
 841     m_error 
= GSOCK_MEMERR
; 
 845   /* Wait for a connection (with timeout) */ 
 846   if (Input_Timeout() == GSOCK_TIMEDOUT
) 
 849     /* m_error set by _GSocket_Input_Timeout */ 
 853   connection
->m_fd 
= accept(m_fd
, &from
, (WX_SOCKLEN_T 
*) &fromlen
); 
 855   /* Reenable CONNECTION events */ 
 856   Enable(GSOCK_CONNECTION
); 
 858   if (connection
->m_fd 
== INVALID_SOCKET
) 
 860     if (errno 
== EWOULDBLOCK
) 
 861       m_error 
= GSOCK_WOULDBLOCK
; 
 863       m_error 
= GSOCK_IOERR
; 
 869   /* Initialize all fields */ 
 870   connection
->m_server   
= false; 
 871   connection
->m_stream   
= true; 
 873   /* Setup the peer address field */ 
 874   connection
->m_peer 
= GAddress_new(); 
 875   if (!connection
->m_peer
) 
 878     m_error 
= GSOCK_MEMERR
; 
 882   err 
= _GAddress_translate_from(connection
->m_peer
, &from
, fromlen
); 
 883   if (err 
!= GSOCK_NOERROR
) 
 890 #if defined(__EMX__) || defined(__VISAGECPP__) 
 891   ioctl(connection
->m_fd
, FIONBIO
, (char*)&arg
, sizeof(arg
)); 
 893   ioctl(connection
->m_fd
, FIONBIO
, &arg
); 
 895   gs_gui_functions
->Enable_Events(connection
); 
 900 bool GSocket::SetReusable() 
 902     /* socket must not be null, and must not be in use/already bound */ 
 903     if (this && m_fd 
== INVALID_SOCKET
) 
 913 bool GSocket::SetBroadcast() 
 915     /* socket must not be in use/already bound */ 
 916     if (m_fd 
== INVALID_SOCKET
) { 
 923 bool GSocket::DontDoBind() 
 925     /* socket must not be in use/already bound */ 
 926     if (m_fd 
== INVALID_SOCKET
) { 
 933 /* Client specific parts */ 
 936  *  For stream (connection oriented) sockets, GSocket_Connect() tries 
 937  *  to establish a client connection to a server using the peer address 
 938  *  as established with GSocket_SetPeer(). Returns GSOCK_NOERROR if the 
 939  *  connection has been successfully established, or one of the error 
 940  *  codes listed below. Note that for nonblocking sockets, a return 
 941  *  value of GSOCK_WOULDBLOCK doesn't mean a failure. The connection 
 942  *  request can be completed later; you should use GSocket_Select() 
 943  *  to poll for GSOCK_CONNECTION | GSOCK_LOST, or wait for the 
 944  *  corresponding asynchronous events. 
 946  *  For datagram (non connection oriented) sockets, GSocket_Connect() 
 947  *  just sets the peer address established with GSocket_SetPeer() as 
 948  *  default destination. 
 951  *    GSOCK_INVSOCK    - the socket is in use or not valid. 
 952  *    GSOCK_INVADDR    - the peer address has not been established. 
 953  *    GSOCK_TIMEDOUT   - timeout, the connection failed. 
 954  *    GSOCK_WOULDBLOCK - connection in progress (nonblocking sockets only) 
 955  *    GSOCK_MEMERR     - couldn't allocate memory. 
 956  *    GSOCK_IOERR      - low-level error. 
 958 GSocketError 
GSocket::Connect(GSocketStream stream
) 
 965   /* Enable CONNECTION events (needed for nonblocking connections) */ 
 966   Enable(GSOCK_CONNECTION
); 
 968   if (m_fd 
!= INVALID_SOCKET
) 
 970     m_error 
= GSOCK_INVSOCK
; 
 971     return GSOCK_INVSOCK
; 
 976     m_error 
= GSOCK_INVADDR
; 
 977     return GSOCK_INVADDR
; 
 980   /* Streamed or dgram socket? */ 
 981   m_stream   
= (stream 
== GSOCK_STREAMED
); 
 983   m_establishing 
= false; 
 985   /* Create the socket */ 
 986   m_fd 
= socket(m_peer
->m_realfamily
, 
 987                      m_stream
? SOCK_STREAM 
: SOCK_DGRAM
, 0); 
 989   if (m_fd 
== INVALID_SOCKET
) 
 991     m_error 
= GSOCK_IOERR
; 
 995   /* FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option */ 
 997   setsockopt(m_fd
, SOL_SOCKET
, SO_NOSIGPIPE
, (const char*)&arg
, sizeof(arg
)); 
1000 #if defined(__EMX__) || defined(__VISAGECPP__) 
1001   ioctl(m_fd
, FIONBIO
, (char*)&arg
, sizeof(arg
)); 
1003   ioctl(m_fd
, FIONBIO
, &arg
); 
1006   // If the reuse flag is set, use the applicable socket reuse flags(s) 
1009     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEADDR
, (const char*)&arg
, sizeof(arg
)); 
1011     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEPORT
, (const char*)&arg
, sizeof(arg
)); 
1015   // If a local address has been set, then we need to bind to it before calling connect 
1016   if (m_local 
&& m_local
->m_addr
) 
1018      bind(m_fd
, m_local
->m_addr
, m_local
->m_len
); 
1021   /* Connect it to the peer address, with a timeout (see below) */ 
1022   ret 
= connect(m_fd
, m_peer
->m_addr
, m_peer
->m_len
); 
1024   /* We only call Enable_Events if we know we aren't shutting down the socket. 
1025    * NB: Enable_Events needs to be called whether the socket is blocking or 
1026    * non-blocking, it just shouldn't be called prior to knowing there is a 
1027    * connection _if_ blocking sockets are being used. 
1028    * If connect above returns 0, we are already connected and need to make the 
1029    * call to Enable_Events now. 
1032   if (m_non_blocking 
|| ret 
== 0) 
1033     gs_gui_functions
->Enable_Events(this); 
1039     /* If connect failed with EINPROGRESS and the GSocket object 
1040      * is in blocking mode, we select() for the specified timeout 
1041      * checking for writability to see if the connection request 
1044     if ((err 
== EINPROGRESS
) && (!m_non_blocking
)) 
1046       if (Output_Timeout() == GSOCK_TIMEDOUT
) 
1049         /* m_error is set in _GSocket_Output_Timeout */ 
1050         return GSOCK_TIMEDOUT
; 
1055         SOCKOPTLEN_T len 
= sizeof(error
); 
1057         getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*) &error
, &len
); 
1059         gs_gui_functions
->Enable_Events(this); 
1062           return GSOCK_NOERROR
; 
1066     /* If connect failed with EINPROGRESS and the GSocket object 
1067      * is set to nonblocking, we set m_error to GSOCK_WOULDBLOCK 
1068      * (and return GSOCK_WOULDBLOCK) but we don't close the socket; 
1069      * this way if the connection completes, a GSOCK_CONNECTION 
1070      * event will be generated, if enabled. 
1072     if ((err 
== EINPROGRESS
) && (m_non_blocking
)) 
1074       m_establishing 
= true; 
1075       m_error 
= GSOCK_WOULDBLOCK
; 
1076       return GSOCK_WOULDBLOCK
; 
1079     /* If connect failed with an error other than EINPROGRESS, 
1080      * then the call to GSocket_Connect has failed. 
1083     m_error 
= GSOCK_IOERR
; 
1088   return GSOCK_NOERROR
; 
1091 /* Datagram sockets */ 
1093 /* GSocket_SetNonOriented: 
1094  *  Sets up this socket as a non-connection oriented (datagram) socket. 
1095  *  Before using this function, the local address must have been set 
1096  *  with GSocket_SetLocal(), or the call will fail. Returns GSOCK_NOERROR 
1097  *  on success, or one of the following otherwise. 
1100  *    GSOCK_INVSOCK - the socket is in use. 
1101  *    GSOCK_INVADDR - the local address has not been set. 
1102  *    GSOCK_IOERR   - low-level error. 
1104 GSocketError 
GSocket::SetNonOriented() 
1110   if (m_fd 
!= INVALID_SOCKET
) 
1112     m_error 
= GSOCK_INVSOCK
; 
1113     return GSOCK_INVSOCK
; 
1118     m_error 
= GSOCK_INVADDR
; 
1119     return GSOCK_INVADDR
; 
1122   /* Initialize all fields */ 
1126   /* Create the socket */ 
1127   m_fd 
= socket(m_local
->m_realfamily
, SOCK_DGRAM
, 0); 
1129   if (m_fd 
== INVALID_SOCKET
) 
1131     m_error 
= GSOCK_IOERR
; 
1134 #if defined(__EMX__) || defined(__VISAGECPP__) 
1135   ioctl(m_fd
, FIONBIO
, (char*)&arg
, sizeof(arg
)); 
1137   ioctl(m_fd
, FIONBIO
, &arg
); 
1139   gs_gui_functions
->Enable_Events(this); 
1143     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEADDR
, (const char*)&arg
, sizeof(arg
)); 
1145     setsockopt(m_fd
, SOL_SOCKET
, SO_REUSEPORT
, (const char*)&arg
, sizeof(arg
)); 
1151     setsockopt(m_fd
, SOL_SOCKET
, SO_BROADCAST
, (const char*)&arg
, sizeof(arg
)); 
1155       /* Bind to the local address, 
1156        * and retrieve the actual address bound. 
1158       if ((bind(m_fd
, m_local
->m_addr
, m_local
->m_len
) != 0) || 
1161                        (WX_SOCKLEN_T 
*) &m_local
->m_len
) != 0)) 
1164         m_error 
= GSOCK_IOERR
; 
1168   return GSOCK_NOERROR
; 
1173 /* Like recv(), send(), ... */ 
1174 int GSocket::Read(char *buffer
, int size
) 
1180   if (m_fd 
== INVALID_SOCKET 
|| m_server
) 
1182     m_error 
= GSOCK_INVSOCK
; 
1186   /* Disable events during query of socket status */ 
1187   Disable(GSOCK_INPUT
); 
1189   /* If the socket is blocking, wait for data (with a timeout) */ 
1190   if (Input_Timeout() == GSOCK_TIMEDOUT
) { 
1191     m_error 
= GSOCK_TIMEDOUT
; 
1192     /* Don't return here immediately, otherwise socket events would not be 
1200       ret 
= Recv_Stream(buffer
, size
); 
1202       ret 
= Recv_Dgram(buffer
, size
); 
1204     /* If recv returned zero, then the connection has been gracefully closed. 
1205      * Otherwise, recv has returned an error (-1), in which case we have lost the 
1206      * socket only if errno does _not_ indicate that there may be more data to read. 
1210       /* Make sure wxSOCKET_LOST event gets sent and shut down the socket */ 
1211       m_detected 
= GSOCK_LOST_FLAG
; 
1217       if ((errno 
== EWOULDBLOCK
) || (errno 
== EAGAIN
)) 
1218         m_error 
= GSOCK_WOULDBLOCK
; 
1220         m_error 
= GSOCK_IOERR
; 
1224   /* Enable events again now that we are done processing */ 
1225   Enable(GSOCK_INPUT
); 
1230 int GSocket::Write(const char *buffer
, int size
) 
1236   GSocket_Debug(( "GSocket_Write #1, size %d\n", size 
)); 
1238   if (m_fd 
== INVALID_SOCKET 
|| m_server
) 
1240     m_error 
= GSOCK_INVSOCK
; 
1244   GSocket_Debug(( "GSocket_Write #2, size %d\n", size 
)); 
1246   /* If the socket is blocking, wait for writability (with a timeout) */ 
1247   if (Output_Timeout() == GSOCK_TIMEDOUT
) 
1250   GSocket_Debug(( "GSocket_Write #3, size %d\n", size 
)); 
1252   /* Write the data */ 
1254     ret 
= Send_Stream(buffer
, size
); 
1256     ret 
= Send_Dgram(buffer
, size
); 
1258   GSocket_Debug(( "GSocket_Write #4, size %d\n", size 
)); 
1262     if ((errno 
== EWOULDBLOCK
) || (errno 
== EAGAIN
)) 
1264       m_error 
= GSOCK_WOULDBLOCK
; 
1265       GSocket_Debug(( "GSocket_Write error WOULDBLOCK\n" )); 
1269       m_error 
= GSOCK_IOERR
; 
1270       GSocket_Debug(( "GSocket_Write error IOERR\n" )); 
1273     /* Only reenable OUTPUT events after an error (just like WSAAsyncSelect 
1274      * in MSW). Once the first OUTPUT event is received, users can assume 
1275      * that the socket is writable until a read operation fails. Only then 
1276      * will further OUTPUT events be posted. 
1278     Enable(GSOCK_OUTPUT
); 
1283   GSocket_Debug(( "GSocket_Write #5, size %d ret %d\n", size
, ret 
)); 
1289  *  Polls the socket to determine its status. This function will 
1290  *  check for the events specified in the 'flags' parameter, and 
1291  *  it will return a mask indicating which operations can be 
1292  *  performed. This function won't block, regardless of the 
1293  *  mode (blocking | nonblocking) of the socket. 
1295 GSocketEventFlags 
GSocket::Select(GSocketEventFlags flags
) 
1297   if (!gs_gui_functions
->CanUseEventLoop()) 
1300     GSocketEventFlags result 
= 0; 
1309         return (GSOCK_LOST_FLAG 
& flags
); 
1311     /* Do not use a static struct, Linux can garble it */ 
1312     tv
.tv_sec 
= m_timeout 
/ 1000; 
1313     tv
.tv_usec 
= (m_timeout 
% 1000) * 1000; 
1315     wxFD_ZERO(&readfds
); 
1316     wxFD_ZERO(&writefds
); 
1317     wxFD_ZERO(&exceptfds
); 
1318     wxFD_SET(m_fd
, &readfds
); 
1319     if (flags 
& GSOCK_OUTPUT_FLAG 
|| flags 
& GSOCK_CONNECTION_FLAG
) 
1320       wxFD_SET(m_fd
, &writefds
); 
1321     wxFD_SET(m_fd
, &exceptfds
); 
1323     /* Check 'sticky' CONNECTION flag first */ 
1324     result 
|= (GSOCK_CONNECTION_FLAG 
& m_detected
); 
1326     /* If we have already detected a LOST event, then don't try 
1327      * to do any further processing. 
1329     if ((m_detected 
& GSOCK_LOST_FLAG
) != 0) 
1331       m_establishing 
= false; 
1333       return (GSOCK_LOST_FLAG 
& flags
); 
1336     /* Try select now */ 
1337     if (select(m_fd 
+ 1, &readfds
, &writefds
, &exceptfds
, &tv
) <= 0) 
1339       /* What to do here? */ 
1340       return (result 
& flags
); 
1343     /* Check for exceptions and errors */ 
1344     if (wxFD_ISSET(m_fd
, &exceptfds
)) 
1346       m_establishing 
= false; 
1347       m_detected 
= GSOCK_LOST_FLAG
; 
1349       /* LOST event: Abort any further processing */ 
1350       return (GSOCK_LOST_FLAG 
& flags
); 
1353     /* Check for readability */ 
1354     if (wxFD_ISSET(m_fd
, &readfds
)) 
1356       result 
|= GSOCK_INPUT_FLAG
; 
1358       if (m_server 
&& m_stream
) 
1360         /* This is a TCP server socket that detected a connection. 
1361           While the INPUT_FLAG is also set, it doesn't matter on 
1362           this kind of  sockets, as we can only Accept() from them. */ 
1363         result 
|= GSOCK_CONNECTION_FLAG
; 
1364         m_detected 
|= GSOCK_CONNECTION_FLAG
; 
1368     /* Check for writability */ 
1369     if (wxFD_ISSET(m_fd
, &writefds
)) 
1371       if (m_establishing 
&& !m_server
) 
1374         SOCKOPTLEN_T len 
= sizeof(error
); 
1376         m_establishing 
= false; 
1378         getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
); 
1382           m_detected 
= GSOCK_LOST_FLAG
; 
1384           /* LOST event: Abort any further processing */ 
1385           return (GSOCK_LOST_FLAG 
& flags
); 
1389           result 
|= GSOCK_CONNECTION_FLAG
; 
1390           m_detected 
|= GSOCK_CONNECTION_FLAG
; 
1395         result 
|= GSOCK_OUTPUT_FLAG
; 
1399     return (result 
& flags
); 
1405     return flags 
& m_detected
; 
1411 /* GSocket_SetNonBlocking: 
1412  *  Sets the socket to non-blocking mode. All IO calls will return 
1415 void GSocket::SetNonBlocking(bool non_block
) 
1419   GSocket_Debug( ("GSocket_SetNonBlocking: %d\n", (int)non_block
) ); 
1421   m_non_blocking 
= non_block
; 
1424 /* GSocket_SetTimeout: 
1425  *  Sets the timeout for blocking calls. Time is expressed in 
1428 void GSocket::SetTimeout(unsigned long millisec
) 
1432   m_timeout 
= millisec
; 
1435 /* GSocket_GetError: 
1436  *  Returns the last error occurred for this socket. Note that successful 
1437  *  operations do not clear this back to GSOCK_NOERROR, so use it only 
1440 GSocketError WXDLLIMPEXP_NET 
GSocket::GetError() 
1450  *   There is data to be read in the input buffer. If, after a read 
1451  *   operation, there is still data available, the callback function will 
1454  *   The socket is available for writing. That is, the next write call 
1455  *   won't block. This event is generated only once, when the connection is 
1456  *   first established, and then only if a call failed with GSOCK_WOULDBLOCK, 
1457  *   when the output buffer empties again. This means that the app should 
1458  *   assume that it can write since the first OUTPUT event, and no more 
1459  *   OUTPUT events will be generated unless an error occurs. 
1461  *   Connection successfully established, for client sockets, or incoming 
1462  *   client connection, for server sockets. Wait for this event (also watch 
1463  *   out for GSOCK_LOST) after you issue a nonblocking GSocket_Connect() call. 
1465  *   The connection is lost (or a connection request failed); this could 
1466  *   be due to a failure, or due to the peer closing it gracefully. 
1469 /* GSocket_SetCallback: 
1470  *  Enables the callbacks specified by 'flags'. Note that 'flags' 
1471  *  may be a combination of flags OR'ed toghether, so the same 
1472  *  callback function can be made to accept different events. 
1473  *  The callback function must have the following prototype: 
1475  *  void function(GSocket *socket, GSocketEvent event, char *cdata) 
1477 void GSocket::SetCallback(GSocketEventFlags flags
, 
1478                          GSocketCallback callback
, char *cdata
) 
1484   for (count 
= 0; count 
< GSOCK_MAX_EVENT
; count
++) 
1486     if ((flags 
& (1 << count
)) != 0) 
1488       m_cbacks
[count
] = callback
; 
1489       m_data
[count
] = cdata
; 
1494 /* GSocket_UnsetCallback: 
1495  *  Disables all callbacks specified by 'flags', which may be a 
1496  *  combination of flags OR'ed toghether. 
1498 void GSocket::UnsetCallback(GSocketEventFlags flags
) 
1504   for (count 
= 0; count 
< GSOCK_MAX_EVENT
; count
++) 
1506     if ((flags 
& (1 << count
)) != 0) 
1508       m_cbacks
[count
] = NULL
; 
1509       m_data
[count
] = NULL
; 
1514 GSocketError 
GSocket::GetSockOpt(int level
, int optname
, 
1515                                 void *optval
, int *optlen
) 
1517     if (getsockopt(m_fd
, level
, optname
, (char*)optval
, (SOCKOPTLEN_T
*)optlen
) == 0) 
1518         return GSOCK_NOERROR
; 
1520     return GSOCK_OPTERR
; 
1523 GSocketError 
GSocket::SetSockOpt(int level
, int optname
, 
1524                                 const void *optval
, int optlen
) 
1526     if (setsockopt(m_fd
, level
, optname
, (const char*)optval
, optlen
) == 0) 
1527         return GSOCK_NOERROR
; 
1529     return GSOCK_OPTERR
; 
1532 #define CALL_CALLBACK(socket, event) {                                  \ 
1533   socket->Disable(event);                                               \ 
1534   if (socket->m_cbacks[event])                                          \ 
1535     socket->m_cbacks[event](socket, event, socket->m_data[event]);      \ 
1539 void GSocket::Enable(GSocketEvent event
) 
1541   m_detected 
&= ~(1 << event
); 
1542   gs_gui_functions
->Install_Callback(this, event
); 
1545 void GSocket::Disable(GSocketEvent event
) 
1547   m_detected 
|= (1 << event
); 
1548   gs_gui_functions
->Uninstall_Callback(this, event
); 
1551 /* _GSocket_Input_Timeout: 
1552  *  For blocking sockets, wait until data is available or 
1553  *  until timeout ellapses. 
1555 GSocketError 
GSocket::Input_Timeout() 
1561   /* Linux select() will overwrite the struct on return */ 
1562   tv
.tv_sec  
= (m_timeout 
/ 1000); 
1563   tv
.tv_usec 
= (m_timeout 
% 1000) * 1000; 
1565   if (!m_non_blocking
) 
1567     wxFD_ZERO(&readfds
); 
1568     wxFD_SET(m_fd
, &readfds
); 
1569     ret 
= select(m_fd 
+ 1, &readfds
, NULL
, NULL
, &tv
); 
1572       GSocket_Debug(( "GSocket_Input_Timeout, select returned 0\n" )); 
1573       m_error 
= GSOCK_TIMEDOUT
; 
1574       return GSOCK_TIMEDOUT
; 
1579       GSocket_Debug(( "GSocket_Input_Timeout, select returned -1\n" )); 
1580       if (errno 
== EBADF
) { GSocket_Debug(( "Invalid file descriptor\n" )); } 
1581       if (errno 
== EINTR
) { GSocket_Debug(( "A non blocked signal was caught\n" )); } 
1582       if (errno 
== EINVAL
) { GSocket_Debug(( "The highest number descriptor is negative\n" )); } 
1583       if (errno 
== ENOMEM
) { GSocket_Debug(( "Not enough memory\n" )); } 
1584       m_error 
= GSOCK_TIMEDOUT
; 
1585       return GSOCK_TIMEDOUT
; 
1589   return GSOCK_NOERROR
; 
1592 /* _GSocket_Output_Timeout: 
1593  *  For blocking sockets, wait until data can be sent without 
1594  *  blocking or until timeout ellapses. 
1596 GSocketError 
GSocket::Output_Timeout() 
1602   /* Linux select() will overwrite the struct on return */ 
1603   tv
.tv_sec  
= (m_timeout 
/ 1000); 
1604   tv
.tv_usec 
= (m_timeout 
% 1000) * 1000; 
1606   GSocket_Debug( ("m_non_blocking has: %d\n", (int)m_non_blocking
) ); 
1608   if (!m_non_blocking
) 
1610     wxFD_ZERO(&writefds
); 
1611     wxFD_SET(m_fd
, &writefds
); 
1612     ret 
= select(m_fd 
+ 1, NULL
, &writefds
, NULL
, &tv
); 
1615       GSocket_Debug(( "GSocket_Output_Timeout, select returned 0\n" )); 
1616       m_error 
= GSOCK_TIMEDOUT
; 
1617       return GSOCK_TIMEDOUT
; 
1622       GSocket_Debug(( "GSocket_Output_Timeout, select returned -1\n" )); 
1623       if (errno 
== EBADF
) { GSocket_Debug(( "Invalid file descriptor\n" )); } 
1624       if (errno 
== EINTR
) { GSocket_Debug(( "A non blocked signal was caught\n" )); } 
1625       if (errno 
== EINVAL
) { GSocket_Debug(( "The highest number descriptor is negative\n" )); } 
1626       if (errno 
== ENOMEM
) { GSocket_Debug(( "Not enough memory\n" )); } 
1627       m_error 
= GSOCK_TIMEDOUT
; 
1628       return GSOCK_TIMEDOUT
; 
1631     if ( ! wxFD_ISSET(m_fd
, &writefds
) ) 
1633         GSocket_Debug(( "GSocket_Output_Timeout is buggy!\n" )); 
1637         GSocket_Debug(( "GSocket_Output_Timeout seems correct\n" )); 
1642     GSocket_Debug(( "GSocket_Output_Timeout, didn't try select!\n" )); 
1645   return GSOCK_NOERROR
; 
1648 int GSocket::Recv_Stream(char *buffer
, int size
) 
1653     ret 
= recv(m_fd
, buffer
, size
, GSOCKET_MSG_NOSIGNAL
); 
1655   while (ret 
== -1 && errno 
== EINTR
); /* Loop until not interrupted */ 
1660 int GSocket::Recv_Dgram(char *buffer
, int size
) 
1662   struct sockaddr from
; 
1663   WX_SOCKLEN_T fromlen 
= sizeof(from
); 
1667   fromlen 
= sizeof(from
); 
1671     ret 
= recvfrom(m_fd
, buffer
, size
, 0, &from
, (WX_SOCKLEN_T 
*) &fromlen
); 
1673   while (ret 
== -1 && errno 
== EINTR
); /* Loop until not interrupted */ 
1678   /* Translate a system address into a GSocket address */ 
1681     m_peer 
= GAddress_new(); 
1684       m_error 
= GSOCK_MEMERR
; 
1689   err 
= _GAddress_translate_from(m_peer
, &from
, fromlen
); 
1690   if (err 
!= GSOCK_NOERROR
) 
1692     GAddress_destroy(m_peer
); 
1701 int GSocket::Send_Stream(const char *buffer
, int size
) 
1709     ret 
= send(m_fd
, (char *)buffer
, size
, GSOCKET_MSG_NOSIGNAL
); 
1711   while (ret 
== -1 && errno 
== EINTR
); /* Loop until not interrupted */ 
1718 int GSocket::Send_Dgram(const char *buffer
, int size
) 
1720   struct sockaddr 
*addr
; 
1726     m_error 
= GSOCK_INVADDR
; 
1730   err 
= _GAddress_translate_to(m_peer
, &addr
, &len
); 
1731   if (err 
!= GSOCK_NOERROR
) 
1741     ret 
= sendto(m_fd
, (char *)buffer
, size
, 0, addr
, len
); 
1743   while (ret 
== -1 && errno 
== EINTR
); /* Loop until not interrupted */ 
1747   /* Frees memory allocated from _GAddress_translate_to */ 
1753 void GSocket::Detected_Read() 
1757   /* Safeguard against straggling call to Detected_Read */ 
1758   if (m_fd 
== INVALID_SOCKET
) 
1763   /* If we have already detected a LOST event, then don't try 
1764    * to do any further processing. 
1766   if ((m_detected 
& GSOCK_LOST_FLAG
) != 0) 
1768     m_establishing 
= false; 
1770     CALL_CALLBACK(this, GSOCK_LOST
); 
1775   int num 
=  recv(m_fd
, &c
, 1, MSG_PEEK 
| GSOCKET_MSG_NOSIGNAL
); 
1779     CALL_CALLBACK(this, GSOCK_INPUT
); 
1783     if (m_server 
&& m_stream
) 
1785       CALL_CALLBACK(this, GSOCK_CONNECTION
); 
1789       /* graceful shutdown */ 
1790       CALL_CALLBACK(this, GSOCK_LOST
); 
1795       /* Do not throw a lost event in cases where the socket isn't really lost */ 
1796       if ((errno 
== EWOULDBLOCK
) || (errno 
== EAGAIN
) || (errno 
== EINTR
)) 
1798         CALL_CALLBACK(this, GSOCK_INPUT
); 
1802         CALL_CALLBACK(this, GSOCK_LOST
); 
1809 void GSocket::Detected_Write() 
1811   /* If we have already detected a LOST event, then don't try 
1812    * to do any further processing. 
1814   if ((m_detected 
& GSOCK_LOST_FLAG
) != 0) 
1816     m_establishing 
= false; 
1818     CALL_CALLBACK(this, GSOCK_LOST
); 
1823   if (m_establishing 
&& !m_server
) 
1826     SOCKOPTLEN_T len 
= sizeof(error
); 
1828     m_establishing 
= false; 
1830     getsockopt(m_fd
, SOL_SOCKET
, SO_ERROR
, (char*)&error
, &len
); 
1834       CALL_CALLBACK(this, GSOCK_LOST
); 
1839       CALL_CALLBACK(this, GSOCK_CONNECTION
); 
1840       /* We have to fire this event by hand because CONNECTION (for clients) 
1841        * and OUTPUT are internally the same and we just disabled CONNECTION 
1842        * events with the above macro. 
1844       CALL_CALLBACK(this, GSOCK_OUTPUT
); 
1849     CALL_CALLBACK(this, GSOCK_OUTPUT
); 
1853 /* Compatibility functions for GSocket */ 
1854 GSocket 
*GSocket_new(void) 
1856     GSocket 
*newsocket 
= new GSocket(); 
1857     if (newsocket
->IsOk()) 
1866  * ------------------------------------------------------------------------- 
1868  * ------------------------------------------------------------------------- 
1871 /* CHECK_ADDRESS verifies that the current address family is either 
1872  * GSOCK_NOFAMILY or GSOCK_*family*, and if it is GSOCK_NOFAMILY, it 
1873  * initalizes it to be a GSOCK_*family*. In other cases, it returns 
1874  * an appropiate error code. 
1876  * CHECK_ADDRESS_RETVAL does the same but returning 'retval' on error. 
1878 #define CHECK_ADDRESS(address, family)                              \ 
1880   if (address->m_family == GSOCK_NOFAMILY)                          \ 
1881     if (_GAddress_Init_##family(address) != GSOCK_NOERROR)          \ 
1882       return address->m_error;                                      \ 
1883   if (address->m_family != GSOCK_##family)                          \ 
1885     address->m_error = GSOCK_INVADDR;                               \ 
1886     return GSOCK_INVADDR;                                           \ 
1890 #define CHECK_ADDRESS_RETVAL(address, family, retval)               \ 
1892   if (address->m_family == GSOCK_NOFAMILY)                          \ 
1893     if (_GAddress_Init_##family(address) != GSOCK_NOERROR)          \ 
1895   if (address->m_family != GSOCK_##family)                          \ 
1897     address->m_error = GSOCK_INVADDR;                               \ 
1903 GAddress 
*GAddress_new(void) 
1907   if ((address 
= (GAddress 
*) malloc(sizeof(GAddress
))) == NULL
) 
1910   address
->m_family  
= GSOCK_NOFAMILY
; 
1911   address
->m_addr    
= NULL
; 
1917 GAddress 
*GAddress_copy(GAddress 
*address
) 
1921   assert(address 
!= NULL
); 
1923   if ((addr2 
= (GAddress 
*) malloc(sizeof(GAddress
))) == NULL
) 
1926   memcpy(addr2
, address
, sizeof(GAddress
)); 
1928   if (address
->m_addr 
&& address
->m_len 
> 0) 
1930     addr2
->m_addr 
= (struct sockaddr 
*)malloc(addr2
->m_len
); 
1931     if (addr2
->m_addr 
== NULL
) 
1936     memcpy(addr2
->m_addr
, address
->m_addr
, addr2
->m_len
); 
1942 void GAddress_destroy(GAddress 
*address
) 
1944   assert(address 
!= NULL
); 
1946   if (address
->m_addr
) 
1947     free(address
->m_addr
); 
1952 void GAddress_SetFamily(GAddress 
*address
, GAddressType type
) 
1954   assert(address 
!= NULL
); 
1956   address
->m_family 
= type
; 
1959 GAddressType 
GAddress_GetFamily(GAddress 
*address
) 
1961   assert(address 
!= NULL
); 
1963   return address
->m_family
; 
1966 GSocketError 
_GAddress_translate_from(GAddress 
*address
, 
1967                                       struct sockaddr 
*addr
, int len
) 
1969   address
->m_realfamily 
= addr
->sa_family
; 
1970   switch (addr
->sa_family
) 
1973       address
->m_family 
= GSOCK_INET
; 
1976       address
->m_family 
= GSOCK_UNIX
; 
1980       address
->m_family 
= GSOCK_INET6
; 
1985       address
->m_error 
= GSOCK_INVOP
; 
1990   if (address
->m_addr
) 
1991     free(address
->m_addr
); 
1993   address
->m_len  
= len
; 
1994   address
->m_addr 
= (struct sockaddr 
*)malloc(len
); 
1996   if (address
->m_addr 
== NULL
) 
1998     address
->m_error 
= GSOCK_MEMERR
; 
1999     return GSOCK_MEMERR
; 
2002   memcpy(address
->m_addr
, addr
, len
); 
2004   return GSOCK_NOERROR
; 
2007 GSocketError 
_GAddress_translate_to(GAddress 
*address
, 
2008                                     struct sockaddr 
**addr
, int *len
) 
2010   if (!address
->m_addr
) 
2012     address
->m_error 
= GSOCK_INVADDR
; 
2013     return GSOCK_INVADDR
; 
2016   *len 
= address
->m_len
; 
2017   *addr 
= (struct sockaddr 
*)malloc(address
->m_len
); 
2020     address
->m_error 
= GSOCK_MEMERR
; 
2021     return GSOCK_MEMERR
; 
2024   memcpy(*addr
, address
->m_addr
, address
->m_len
); 
2025   return GSOCK_NOERROR
; 
2029  * ------------------------------------------------------------------------- 
2030  * Internet address family 
2031  * ------------------------------------------------------------------------- 
2034 GSocketError 
_GAddress_Init_INET(GAddress 
*address
) 
2036   address
->m_len  
= sizeof(struct sockaddr_in
); 
2037   address
->m_addr 
= (struct sockaddr 
*) malloc(address
->m_len
); 
2038   if (address
->m_addr 
== NULL
) 
2040     address
->m_error 
= GSOCK_MEMERR
; 
2041     return GSOCK_MEMERR
; 
2044   address
->m_family 
= GSOCK_INET
; 
2045   address
->m_realfamily 
= PF_INET
; 
2046   ((struct sockaddr_in 
*)address
->m_addr
)->sin_family 
= AF_INET
; 
2047   ((struct sockaddr_in 
*)address
->m_addr
)->sin_addr
.s_addr 
= INADDR_ANY
; 
2049   return GSOCK_NOERROR
; 
2052 GSocketError 
GAddress_INET_SetHostName(GAddress 
*address
, const char *hostname
) 
2055   struct in_addr 
*addr
; 
2057   assert(address 
!= NULL
); 
2059   CHECK_ADDRESS(address
, INET
); 
2061   addr 
= &(((struct sockaddr_in 
*)address
->m_addr
)->sin_addr
); 
2063   /* If it is a numeric host name, convert it now */ 
2064 #if defined(HAVE_INET_ATON) 
2065   if (inet_aton(hostname
, addr
) == 0) 
2067 #elif defined(HAVE_INET_ADDR) 
2068   if ( (addr
->s_addr 
= inet_addr(hostname
)) == (unsigned)-1 ) 
2071   /* Use gethostbyname by default */ 
2073   int val 
= 1;  /* VA doesn't like constants in conditional expressions */ 
2078     struct in_addr 
*array_addr
; 
2080     /* It is a real name, we solve it */ 
2082 #if defined(HAVE_FUNC_GETHOSTBYNAME_R_3) 
2083     struct hostent_data buffer
; 
2088     he 
= wxGethostbyname_r(hostname
, &h
, (void*)&buffer
, sizeof(buffer
), &err
); 
2091       /* Reset to invalid address */ 
2092       addr
->s_addr 
= INADDR_NONE
; 
2093       address
->m_error 
= GSOCK_NOHOST
; 
2094       return GSOCK_NOHOST
; 
2097     array_addr 
= (struct in_addr 
*) *(he
->h_addr_list
); 
2098     addr
->s_addr 
= array_addr
[0].s_addr
; 
2101   return GSOCK_NOERROR
; 
2105 GSocketError 
GAddress_INET_SetBroadcastAddress(GAddress 
*address
) 
2107   return GAddress_INET_SetHostAddress(address
, INADDR_BROADCAST
); 
2110 GSocketError 
GAddress_INET_SetAnyAddress(GAddress 
*address
) 
2112   return GAddress_INET_SetHostAddress(address
, INADDR_ANY
); 
2115 GSocketError 
GAddress_INET_SetHostAddress(GAddress 
*address
, 
2116                                           unsigned long hostaddr
) 
2118   struct in_addr 
*addr
; 
2120   assert(address 
!= NULL
); 
2122   CHECK_ADDRESS(address
, INET
); 
2124   addr 
= &(((struct sockaddr_in 
*)address
->m_addr
)->sin_addr
); 
2125   addr
->s_addr 
= htonl(hostaddr
); 
2127   return GSOCK_NOERROR
; 
2130 GSocketError 
GAddress_INET_SetPortName(GAddress 
*address
, const char *port
, 
2131                                        const char *protocol
) 
2134   struct sockaddr_in 
*addr
; 
2136   assert(address 
!= NULL
); 
2137   CHECK_ADDRESS(address
, INET
); 
2141     address
->m_error 
= GSOCK_INVPORT
; 
2142     return GSOCK_INVPORT
; 
2145 #if defined(HAVE_FUNC_GETSERVBYNAME_R_4) 
2146     struct servent_data buffer
; 
2150   struct servent serv
; 
2151   se 
= wxGetservbyname_r(port
, protocol
, &serv
, 
2152                          (void*)&buffer
, sizeof(buffer
)); 
2155     /* the cast to int suppresses compiler warnings about subscript having the 
2157     if (isdigit((int)port
[0])) 
2161       port_int 
= atoi(port
); 
2162       addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2163       addr
->sin_port 
= htons(port_int
); 
2164       return GSOCK_NOERROR
; 
2167     address
->m_error 
= GSOCK_INVPORT
; 
2168     return GSOCK_INVPORT
; 
2171   addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2172   addr
->sin_port 
= se
->s_port
; 
2174   return GSOCK_NOERROR
; 
2177 GSocketError 
GAddress_INET_SetPort(GAddress 
*address
, unsigned short port
) 
2179   struct sockaddr_in 
*addr
; 
2181   assert(address 
!= NULL
); 
2182   CHECK_ADDRESS(address
, INET
); 
2184   addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2185   addr
->sin_port 
= htons(port
); 
2187   return GSOCK_NOERROR
; 
2190 GSocketError 
GAddress_INET_GetHostName(GAddress 
*address
, char *hostname
, size_t sbuf
) 
2194   struct sockaddr_in 
*addr
; 
2196   assert(address 
!= NULL
); 
2197   CHECK_ADDRESS(address
, INET
); 
2199   addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2200   addr_buf 
= (char *)&(addr
->sin_addr
); 
2202   struct hostent temphost
; 
2203 #if defined(HAVE_FUNC_GETHOSTBYNAME_R_3) 
2204   struct hostent_data buffer
; 
2209   he 
= wxGethostbyaddr_r(addr_buf
, sizeof(addr
->sin_addr
), AF_INET
, &temphost
, 
2210                          (void*)&buffer
, sizeof(buffer
), &err
); 
2213     address
->m_error 
= GSOCK_NOHOST
; 
2214     return GSOCK_NOHOST
; 
2217   strncpy(hostname
, he
->h_name
, sbuf
); 
2219   return GSOCK_NOERROR
; 
2222 unsigned long GAddress_INET_GetHostAddress(GAddress 
*address
) 
2224   struct sockaddr_in 
*addr
; 
2226   assert(address 
!= NULL
); 
2227   CHECK_ADDRESS_RETVAL(address
, INET
, 0); 
2229   addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2231   return ntohl(addr
->sin_addr
.s_addr
); 
2234 unsigned short GAddress_INET_GetPort(GAddress 
*address
) 
2236   struct sockaddr_in 
*addr
; 
2238   assert(address 
!= NULL
); 
2239   CHECK_ADDRESS_RETVAL(address
, INET
, 0); 
2241   addr 
= (struct sockaddr_in 
*)address
->m_addr
; 
2242   return ntohs(addr
->sin_port
); 
2246  * ------------------------------------------------------------------------- 
2247  * Unix address family 
2248  * ------------------------------------------------------------------------- 
2251 #ifndef __VISAGECPP__ 
2252 GSocketError 
_GAddress_Init_UNIX(GAddress 
*address
) 
2254   address
->m_len  
= sizeof(struct sockaddr_un
); 
2255   address
->m_addr 
= (struct sockaddr 
*)malloc(address
->m_len
); 
2256   if (address
->m_addr 
== NULL
) 
2258     address
->m_error 
= GSOCK_MEMERR
; 
2259     return GSOCK_MEMERR
; 
2262   address
->m_family 
= GSOCK_UNIX
; 
2263   address
->m_realfamily 
= PF_UNIX
; 
2264   ((struct sockaddr_un 
*)address
->m_addr
)->sun_family 
= AF_UNIX
; 
2265   ((struct sockaddr_un 
*)address
->m_addr
)->sun_path
[0] = 0; 
2267   return GSOCK_NOERROR
; 
2270 #define UNIX_SOCK_PATHLEN (sizeof(addr->sun_path)/sizeof(addr->sun_path[0])) 
2272 GSocketError 
GAddress_UNIX_SetPath(GAddress 
*address
, const char *path
) 
2274   struct sockaddr_un 
*addr
; 
2276   assert(address 
!= NULL
); 
2278   CHECK_ADDRESS(address
, UNIX
); 
2280   addr 
= ((struct sockaddr_un 
*)address
->m_addr
); 
2281   strncpy(addr
->sun_path
, path
, UNIX_SOCK_PATHLEN
); 
2282   addr
->sun_path
[UNIX_SOCK_PATHLEN 
- 1] = '\0'; 
2284   return GSOCK_NOERROR
; 
2287 GSocketError 
GAddress_UNIX_GetPath(GAddress 
*address
, char *path
, size_t sbuf
) 
2289   struct sockaddr_un 
*addr
; 
2291   assert(address 
!= NULL
); 
2292   CHECK_ADDRESS(address
, UNIX
); 
2294   addr 
= (struct sockaddr_un 
*)address
->m_addr
; 
2296   strncpy(path
, addr
->sun_path
, sbuf
); 
2298   return GSOCK_NOERROR
; 
2300 #endif  /* !defined(__VISAGECPP__) */ 
2301 #endif  /* wxUSE_SOCKETS || defined(__GSOCKET_STANDALONE__) */