]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/gsocket.c
C++ comments in C files are fun but break the compilation (for the Nth time)
[wxWidgets.git] / src / unix / gsocket.c
index 74121ebb4ef476be2712d30e655067ea24d80b8f..ad6dc22ce6a1d5ca028ecd6aa3bb15e57525933d 100644 (file)
 #if wxUSE_SOCKETS
 
 #include <assert.h>
-#include <sys/ioctl.h>
 #include <sys/types.h>
-#ifdef vms
+#include <netdb.h>
+#include <sys/ioctl.h>
+#ifdef __VMS__
 #include <socket.h>
+struct sockaddr_un {
+       u_char  sun_len;                /* sockaddr len including null */
+       u_char  sun_family;             /* AF_UNIX */
+       char    sun_path[108];          /* path name (gag) */
+};
 #else
 #include <sys/socket.h>
-#endif
 #include <sys/un.h>
+#endif
 #include <sys/time.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
-#include <netdb.h>
 #include <errno.h>
 
 #include <string.h>
 
 #ifndef SOCKLEN_T
 
-#ifdef __GLIBC__
-#      if __GLIBC__ == 2
-#         define SOCKLEN_T socklen_t
-#      endif
+#ifdef VMS
+#  define SOCKLEN_T unsigned int
 #else
-#      define SOCKLEN_T int
+#  ifdef __GLIBC__
+#    if __GLIBC__ == 2
+#       define SOCKLEN_T socklen_t
+#    endif
+#  else
+#    define SOCKLEN_T int
+#  endif
 #endif
 
-#endif
+#endif /* SOCKLEN_T */
 
 #define MASK_SIGNAL()                       \
 {                                           \
@@ -203,7 +212,7 @@ GAddress *GSocket_GetLocal(GSocket *socket)
 {
   GAddress *address;
   struct sockaddr addr;
-  SOCKLEN_T size;
+  SOCKLEN_T size = sizeof(addr);
   GSocketError err;
 
   assert(socket != NULL);
@@ -218,7 +227,7 @@ GAddress *GSocket_GetLocal(GSocket *socket)
 
   size = sizeof(addr);
 
-  if (getsockname(socket->m_fd, &addr, &size) < 0) {
+  if (getsockname(socket->m_fd, &addr, (SOCKLEN_T *) &size) < 0) {
     socket->m_error = GSOCK_IOERR;
     return NULL;
   }
@@ -228,9 +237,10 @@ GAddress *GSocket_GetLocal(GSocket *socket)
     socket->m_error = GSOCK_MEMERR;
     return NULL;
   }
-  socket->m_error = _GAddress_translate_from(address, &addr, size);
-  if (socket->m_error != GSOCK_NOERROR) {
+  err = _GAddress_translate_from(address, &addr, size); /*xxx*/
+  if (err != GSOCK_NOERROR) {
     GAddress_destroy(address);
+    socket->m_error = err;
     return NULL;
   }
 
@@ -312,7 +322,10 @@ GSocketError GSocket_SetServer(GSocket *sck)
  */
 GSocket *GSocket_WaitConnection(GSocket *socket)
 {
+  struct sockaddr from;
+  SOCKLEN_T fromlen = sizeof(from);
   GSocket *connection;
+  GSocketError err;
   int arg = 1;
 
   assert(socket != NULL);
@@ -331,7 +344,7 @@ GSocket *GSocket_WaitConnection(GSocket *socket)
   connection = GSocket_new();
   if (!connection)
   {
-    connection->m_error = GSOCK_MEMERR;
+    socket->m_error = GSOCK_MEMERR;
     return NULL;
   }
 
@@ -343,7 +356,7 @@ GSocket *GSocket_WaitConnection(GSocket *socket)
     return NULL;
   }
 
-  connection->m_fd = accept(socket->m_fd, NULL, NULL);
+  connection->m_fd = accept(socket->m_fd, &from, (SOCKLEN_T *) &fromlen);
 
   if (connection->m_fd == -1)
   {
@@ -361,6 +374,23 @@ GSocket *GSocket_WaitConnection(GSocket *socket)
   connection->m_stream   = TRUE;
   connection->m_oriented = TRUE;
 
+  /* Setup the peer address field */ /*xxx*/
+  connection->m_peer = GAddress_new();
+  if (!connection->m_peer)
+  {
+    GSocket_destroy(connection);
+    socket->m_error = GSOCK_MEMERR;
+    return NULL;
+  }
+  err = _GAddress_translate_from(connection->m_peer, &from, fromlen);
+  if (err != GSOCK_NOERROR)
+  {
+    GAddress_destroy(connection->m_peer);
+    GSocket_destroy(connection);
+    socket->m_error = err;
+    return NULL;
+  }
+
   ioctl(connection->m_fd, FIONBIO, &arg);
   _GSocket_Enable_Events(connection);
 
@@ -485,12 +515,10 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
         close(sck->m_fd);
         sck->m_fd = -1;
         /* sck->m_error is set in _GSocket_Output_Timeout */
-        fprintf(stderr, "Blocking connect timeouts\n");
         return GSOCK_TIMEDOUT;
       }
       else
       {
-        fprintf(stderr, "Blocking connect OK\n");
         return GSOCK_NOERROR;
       }
     }
@@ -505,7 +533,6 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
     {
       sck->m_error = GSOCK_WOULDBLOCK;
       sck->m_establishing = TRUE;
-      fprintf(stderr, "Nonblocking connect in progress\n");
 
       return GSOCK_WOULDBLOCK;
     }
@@ -517,11 +544,9 @@ GSocketError GSocket_Connect(GSocket *sck, GSocketStream stream)
     sck->m_fd = -1;
     sck->m_error = GSOCK_IOERR;
 
-    fprintf(stderr, "Connect failed (generic err)\n");
     return GSOCK_IOERR;
   }
 
-  fprintf(stderr, "Connect OK\n");
   return GSOCK_NOERROR;
 }
 
@@ -797,14 +822,14 @@ int _GSocket_Recv_Stream(GSocket *socket, char *buffer, int size)
 int _GSocket_Recv_Dgram(GSocket *socket, char *buffer, int size)
 {
   struct sockaddr from;
-  SOCKLEN_T fromlen;
+  SOCKLEN_T fromlen = sizeof(from);
   int ret;
   GSocketError err;
 
   fromlen = sizeof(from);
 
   MASK_SIGNAL();
-  ret = recvfrom(socket->m_fd, buffer, size, 0, &from, &fromlen);
+  ret = recvfrom(socket->m_fd, buffer, size, 0, &from, (SOCKLEN_T *) &fromlen);
   UNMASK_SIGNAL();
 
   if (ret == -1)
@@ -835,7 +860,6 @@ int _GSocket_Recv_Dgram(GSocket *socket, char *buffer, int size)
 int _GSocket_Send_Stream(GSocket *socket, const char *buffer, int size)
 {
   int ret;
-  GSocketError err;
 
   MASK_SIGNAL();
   ret = send(socket->m_fd, buffer, size, 0);
@@ -906,7 +930,8 @@ void _GSocket_Detected_Write(GSocket *socket)
     socket->m_establishing = FALSE;
 
     len = sizeof(error);
-    getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, (void*) &error, &len);
+    getsockopt(socket->m_fd, SOL_SOCKET, SO_ERROR, (void*) &error,
+           (SOCKLEN_T *) &len);
 
     if (error)
     {
@@ -1075,7 +1100,7 @@ GSocketError _GAddress_translate_to(GAddress *address,
 GSocketError _GAddress_Init_INET(GAddress *address)
 {
   address->m_len  = sizeof(struct sockaddr_in);
-  address->m_addr = (struct sockaddr *)malloc(address->m_len));
+  address->m_addr = (struct sockaddr *)malloc(address->m_len);
   if (address->m_addr == NULL)
   {
     address->m_error = GSOCK_MEMERR;
@@ -1085,7 +1110,11 @@ GSocketError _GAddress_Init_INET(GAddress *address)
   address->m_family = GSOCK_INET;
   address->m_realfamily = PF_INET;
   ((struct sockaddr_in *)address->m_addr)->sin_family = AF_INET;
-  ((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_ANY;
+  /*
+     INADDR_BROADCAST is identical to INADDR_NONE which is not defined
+     on all unices. INADDR_BROADCAST should be fine to indicate an error.
+   */
+  ((struct sockaddr_in *)address->m_addr)->sin_addr.s_addr = INADDR_BROADCAST;
 
   return GSOCK_NOERROR;
 }
@@ -1294,3 +1323,4 @@ GSocketError GAddress_UNIX_GetPath(GAddress *address, char *path, size_t sbuf)
 
 #endif
   /* wxUSE_SOCKETS */
+