Przeglądaj źródła

BSocket: minor changes

ambrop7 15 lat temu
rodzic
commit
df4ea40f5e
2 zmienionych plików z 81 dodań i 60 usunięć
  1. 73 53
      system/BSocket.c
  2. 8 7
      system/BSocket.h

+ 73 - 53
system/BSocket.c

@@ -47,7 +47,24 @@
 #define HANDLER_CONNECT 3
 #define NUM_EVENTS 4
 
-int handler_events[] = {
+static int get_event_index (int event)
+{
+    switch (event) {
+        case BSOCKET_READ:
+            return HANDLER_READ;
+        case BSOCKET_WRITE:
+            return HANDLER_WRITE;
+        case BSOCKET_ACCEPT:
+            return HANDLER_ACCEPT;
+        case BSOCKET_CONNECT:
+            return HANDLER_CONNECT;
+        default:
+            ASSERT(0)
+            return 42;
+    }
+}
+
+static int handler_events[] = {
     [HANDLER_READ] = BSOCKET_READ,
     [HANDLER_WRITE] = BSOCKET_WRITE,
     [HANDLER_ACCEPT] = BSOCKET_ACCEPT,
@@ -120,6 +137,10 @@ static int translate_error (int error)
             return BSOCKET_ERROR_ADDRESS_IN_USE;
         case WSAECONNRESET:
             return BSOCKET_ERROR_CONNECTION_RESET;
+        case WSAETIMEDOUT:
+            return BSOCKET_ERROR_CONNECTION_TIMED_OUT;
+        case WSAECONNREFUSED:
+            return BSOCKET_ERROR_CONNECTION_REFUSED;
     }
     
     #else
@@ -192,15 +213,11 @@ static void addr_sys_to_socket (BAddr *out, struct sys_addr *addr)
     switch (addr->addr.generic.sa_family) {
         case AF_INET:
             ASSERT(addr->len == sizeof(struct sockaddr_in))
-            out->type = BADDR_TYPE_IPV4;
-            out->ipv4.ip = addr->addr.ipv4.sin_addr.s_addr;
-            out->ipv4.port = addr->addr.ipv4.sin_port;
+            BAddr_InitIPv4(out, addr->addr.ipv4.sin_addr.s_addr, addr->addr.ipv4.sin_port);
             break;
         case AF_INET6:
             ASSERT(addr->len == sizeof(struct sockaddr_in6))
-            out->type = BADDR_TYPE_IPV6;
-            memcpy(out->ipv6.ip, addr->addr.ipv6.sin6_addr.s6_addr, 16);
-            out->ipv6.port = addr->addr.ipv6.sin6_port;
+            BAddr_InitIPv6(out, addr->addr.ipv6.sin6_addr.s6_addr, addr->addr.ipv6.sin6_port);
             break;
         default:
             BAddr_InitNone(out);
@@ -208,23 +225,6 @@ static void addr_sys_to_socket (BAddr *out, struct sys_addr *addr)
     }
 }
 
-static int get_event_index (int event)
-{
-    switch (event) {
-        case BSOCKET_READ:
-            return HANDLER_READ;
-        case BSOCKET_WRITE:
-            return HANDLER_WRITE;
-        case BSOCKET_ACCEPT:
-            return HANDLER_ACCEPT;
-        case BSOCKET_CONNECT:
-            return HANDLER_CONNECT;
-        default:
-            ASSERT(0)
-            return 42;
-    }
-}
-
 static void dispatch_event (BSocket *bs)
 {
     ASSERT(!bs->global_handler)
@@ -265,6 +265,7 @@ static void job_handler (BSocket *bs)
     ASSERT(bs->current_event_index >= 0)
     ASSERT(bs->current_event_index < NUM_EVENTS)
     ASSERT(((bs->ready_events)&~(bs->waitEvents)) == 0) // BSocket_DisableEvent clears events from ready_events
+    DebugObject_Access(&bs->d_obj);
     
     dispatch_event(bs);
     return;
@@ -315,6 +316,8 @@ static long get_wsa_events (int sock_events)
 
 static void handle_handler (BSocket *bs)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     // enumerate network events and reset event
     WSANETWORKEVENTS events;
     int res = WSAEnumNetworkEvents(bs->socket, bs->event, &events);
@@ -342,24 +345,16 @@ static void handle_handler (BSocket *bs)
     
     if (bs->waitEvents&BSOCKET_CONNECT) {
         if (events.lNetworkEvents&FD_CONNECT) {
+            returned_events |= BSOCKET_CONNECT;
+            
             // read connection attempt result
             ASSERT(bs->connecting_status == 1)
             bs->connecting_status = 2;
-            switch (events.iErrorCode[FD_CONNECT_BIT]) {
-                case 0:
-                    bs->connecting_result = BSOCKET_ERROR_NONE;
-                    break;
-                case WSAETIMEDOUT:
-                    bs->connecting_result = BSOCKET_ERROR_CONNECTION_TIMED_OUT;
-                    break;
-                case WSAECONNREFUSED:
-                    bs->connecting_result = BSOCKET_ERROR_CONNECTION_REFUSED;
-                    break;
-                default:
-                    bs->connecting_result = BSOCKET_ERROR_UNKNOWN;
+            if (events.iErrorCode[FD_CONNECT_BIT] == 0) {
+                bs->connecting_result = BSOCKET_ERROR_NONE;
+            } else {
+                bs->connecting_result = translate_error(events.iErrorCode[FD_CONNECT_BIT]);
             }
-            
-            returned_events |= BSOCKET_CONNECT;
         }
     }
     
@@ -385,6 +380,8 @@ static int get_reactor_fd_events (int sock_events)
 
 static void file_descriptor_handler (BSocket *bs, int events)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     int returned_events = 0;
     
     if ((bs->waitEvents&BSOCKET_READ) && (events&BREACTOR_READ)) {
@@ -409,18 +406,10 @@ static void file_descriptor_handler (BSocket *bs, int events)
         socklen_t result_len = sizeof(result);
         int res = getsockopt(bs->socket, SOL_SOCKET, SO_ERROR, &result, &result_len);
         ASSERT_FORCE(res == 0)
-        switch (result) {
-            case 0:
-                bs->connecting_result = BSOCKET_ERROR_NONE;
-                break;
-            case ETIMEDOUT:
-                bs->connecting_result = BSOCKET_ERROR_CONNECTION_TIMED_OUT;
-                break;
-            case ECONNREFUSED:
-                bs->connecting_result = BSOCKET_ERROR_CONNECTION_REFUSED;
-                break;
-            default:
-                bs->connecting_result = BSOCKET_ERROR_UNKNOWN;
+        if (result == 0) {
+            bs->connecting_result = BSOCKET_ERROR_NONE;
+        } else {
+            bs->connecting_result = translate_error(result);
         }
     }
     
@@ -633,7 +622,6 @@ int BSocket_Init (BSocket *bs, BReactor *bsys, int domain, int type)
         goto fail1;
     }
     
-    // init debug object
     DebugObject_Init(&bs->d_obj);
     
     return 0;
@@ -647,7 +635,6 @@ fail0:
 
 void BSocket_Free (BSocket *bs)
 {
-    // free debug object
     DebugObject_Free(&bs->d_obj);
     
     // free event backend
@@ -662,6 +649,8 @@ void BSocket_Free (BSocket *bs)
 
 void BSocket_SetRecvMax (BSocket *bs, int max)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     ASSERT(max > 0 || max == -1)
     
     bs->recv_max = max;
@@ -670,11 +659,15 @@ void BSocket_SetRecvMax (BSocket *bs, int max)
 
 int BSocket_GetError (BSocket *bs)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     return bs->error;
 }
 
 void BSocket_AddGlobalEventHandler (BSocket *bs, BSocket_handler handler, void *user)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     ASSERT(handler)
     ASSERT(!bs->global_handler)
     ASSERT(!bs->handlers[0])
@@ -692,6 +685,7 @@ void BSocket_AddGlobalEventHandler (BSocket *bs, BSocket_handler handler, void *
 void BSocket_RemoveGlobalEventHandler (BSocket *bs)
 {
     ASSERT(bs->global_handler)
+    DebugObject_Access(&bs->d_obj);
     
     bs->global_handler = NULL;
     bs->waitEvents = 0;
@@ -700,6 +694,7 @@ void BSocket_RemoveGlobalEventHandler (BSocket *bs)
 void BSocket_SetGlobalEvents (BSocket *bs, int events)
 {
     ASSERT(bs->global_handler)
+    DebugObject_Access(&bs->d_obj);
     
     // update events
     bs->waitEvents = events;
@@ -712,6 +707,7 @@ void BSocket_AddEventHandler (BSocket *bs, uint8_t event, BSocket_handler handle
 {
     ASSERT(handler)
     ASSERT(!bs->global_handler)
+    DebugObject_Access(&bs->d_obj);
     
     // get index
     int i = get_event_index(event);
@@ -726,6 +722,8 @@ void BSocket_AddEventHandler (BSocket *bs, uint8_t event, BSocket_handler handle
 
 void BSocket_RemoveEventHandler (BSocket *bs, uint8_t event)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     // get table index
     int i = get_event_index(event);
     
@@ -743,6 +741,8 @@ void BSocket_RemoveEventHandler (BSocket *bs, uint8_t event)
 
 void BSocket_EnableEvent (BSocket *bs, uint8_t event)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     #ifndef NDEBUG
     // check event and incompatible events
     switch (event) {
@@ -782,6 +782,8 @@ void BSocket_EnableEvent (BSocket *bs, uint8_t event)
 
 void BSocket_DisableEvent (BSocket *bs, uint8_t event)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     // check event and get index
     int index = get_event_index(event);
     
@@ -804,7 +806,8 @@ int BSocket_Connect (BSocket *bs, BAddr *addr)
     ASSERT(addr)
     ASSERT(!BAddr_IsInvalid(addr))
     ASSERT(bs->connecting_status == 0)
-
+    DebugObject_Access(&bs->d_obj);
+    
     struct sys_addr sysaddr;
     addr_socket_to_sys(&sysaddr, addr);
 
@@ -837,6 +840,7 @@ int BSocket_Connect (BSocket *bs, BAddr *addr)
 int BSocket_GetConnectResult (BSocket *bs)
 {
     ASSERT(bs->connecting_status == 2)
+    DebugObject_Access(&bs->d_obj);
 
     bs->connecting_status = 0;
     
@@ -847,6 +851,7 @@ int BSocket_Bind (BSocket *bs, BAddr *addr)
 {
     ASSERT(addr)
     ASSERT(!BAddr_IsInvalid(addr))
+    DebugObject_Access(&bs->d_obj);
     
     struct sys_addr sysaddr;
     addr_socket_to_sys(&sysaddr, addr);
@@ -879,6 +884,9 @@ int BSocket_Bind (BSocket *bs, BAddr *addr)
 
 int BSocket_Listen (BSocket *bs, int backlog)
 {
+    ASSERT(bs->type == BSOCKET_TYPE_STREAM)
+    DebugObject_Access(&bs->d_obj);
+    
     if (backlog < 0) {
         backlog = BSOCKET_DEFAULT_BACKLOG;
     }
@@ -900,6 +908,9 @@ int BSocket_Listen (BSocket *bs, int backlog)
 
 int BSocket_Accept (BSocket *bs, BSocket *newsock, BAddr *addr)
 {
+    ASSERT(bs->type == BSOCKET_TYPE_STREAM)
+    DebugObject_Access(&bs->d_obj);
+    
     struct sys_addr sysaddr;
     sysaddr.len = sizeof(sysaddr.addr);
     
@@ -988,6 +999,7 @@ int BSocket_Send (BSocket *bs, uint8_t *data, int len)
 {
     ASSERT(len >= 0)
     ASSERT(bs->type == BSOCKET_TYPE_STREAM)
+    DebugObject_Access(&bs->d_obj);
     
     #ifdef BADVPN_USE_WINAPI
     int flags = 0;
@@ -1027,6 +1039,7 @@ int BSocket_Recv (BSocket *bs, uint8_t *data, int len)
 {
     ASSERT(len >= 0)
     ASSERT(bs->type == BSOCKET_TYPE_STREAM)
+    DebugObject_Access(&bs->d_obj);
     
     if (limit_recv(bs)) {
         bs->error = BSOCKET_ERROR_LATER;
@@ -1068,6 +1081,7 @@ int BSocket_SendToFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAdd
     ASSERT(!BAddr_IsInvalid(addr))
     ASSERT(local_addr)
     ASSERT(bs->type == BSOCKET_TYPE_DGRAM)
+    DebugObject_Access(&bs->d_obj);
     
     struct sys_addr remote_sysaddr;
     addr_socket_to_sys(&remote_sysaddr, addr);
@@ -1230,6 +1244,7 @@ int BSocket_RecvFromTo (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAdd
     ASSERT(addr)
     ASSERT(local_addr)
     ASSERT(bs->type == BSOCKET_TYPE_DGRAM)
+    DebugObject_Access(&bs->d_obj);
     
     if (limit_recv(bs)) {
         bs->error = BSOCKET_ERROR_LATER;
@@ -1376,6 +1391,7 @@ int BSocket_RecvFromTo (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAdd
 int BSocket_GetPeerName (BSocket *bs, BAddr *addr)
 {
     ASSERT(addr)
+    DebugObject_Access(&bs->d_obj);
     
     struct sys_addr sysaddr;
     sysaddr.len = sizeof(sysaddr.addr);
@@ -1418,6 +1434,8 @@ static int create_unix_sysaddr (struct sockaddr_un *addr, size_t *addr_len, cons
 
 int BSocket_BindUnix (BSocket *bs, const char *path)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     struct sockaddr_un sys_addr;
     size_t addr_len;
     
@@ -1437,6 +1455,8 @@ int BSocket_BindUnix (BSocket *bs, const char *path)
 
 int BSocket_ConnectUnix (BSocket *bs, const char *path)
 {
+    DebugObject_Access(&bs->d_obj);
+    
     struct sockaddr_un sys_addr;
     size_t addr_len;
     

+ 8 - 7
system/BSocket.h

@@ -303,7 +303,7 @@ int BSocket_Bind (BSocket *bs, BAddr *addr) WARN_UNUSED;
 /**
  * Marks the socket as a listening socket.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_STREAM socket.
  * @param backlog whatever this means in the system's listen() function. If it's
  *                negative, BSOCKET_DEFAULT_BACKLOG will be used.
  * @return 0 for success,
@@ -316,9 +316,10 @@ int BSocket_Listen (BSocket *bs, int backlog) WARN_UNUSED;
 /**
  * Accepts a connection on a listening socket.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_STREAM socket.
  * @param newsock on success, the new socket will be stored here. If it is NULL and a connection
- *                was accepted, it is closed immediately (but the function succeeds).
+ *                was accepted, it is closed immediately (but the function succeeds). The resulting
+ *                socket will have the same domain and type as the listening socket.
  * @param addr if not NULL, the client address will be stored here on success.
  *             The returned address may be an invalid address.
  * @return 0 for success,
@@ -331,7 +332,7 @@ int BSocket_Accept (BSocket *bs, BSocket *newsock, BAddr *addr) WARN_UNUSED;
 /**
  * Sends data on a stream socket.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_STREAM socket.
  * @param data buffer to read data from
  * @param len amount of data. Must be >=0.
  * @return non-negative value for amount of data sent,
@@ -347,7 +348,7 @@ int BSocket_Send (BSocket *bs, uint8_t *data, int len) WARN_UNUSED;
 /**
  * Receives data on a stream socket.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_STREAM socket.
  * @param data buffer to write data to
  * @param len maximum amount of data to read. Must be >=0.
  * @return - non-negative value for amount of data read; on stream sockets the value 0
@@ -365,7 +366,7 @@ int BSocket_Recv (BSocket *bs, uint8_t *data, int len) WARN_UNUSED;
  * Sends a datagram on a datagram socket to the specified address
  * from the specified local source address.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_DGRAM socket.
  * @param data buffer to read data from
  * @param len amount of data. Must be >=0.
  * @param addr remote address. Must be valid.
@@ -384,7 +385,7 @@ int BSocket_SendToFrom (BSocket *bs, uint8_t *data, int len, BAddr *addr, BIPAdd
  * Receives a datagram on a datagram socket and returns the sender address
  * and the local destination address.
  *
- * @param bs the object
+ * @param bs the object. Must be a BSOCKET_TYPE_DGRAM socket.
  * @param data buffer to write data to
  * @param len maximum amount of data to read. Must be >=0.
  * @param addr the sender address will be stored here on success. Must not be NULL.