LCOV - code coverage report
Current view: top level - netio-next/src - socket_list.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 59 94 62.8 %
Date: 2025-08-12 04:15:35 Functions: 5 8 62.5 %

          Line data    Source code
       1             : #include "netio.h"
       2             : #include "log.h"
       3             : #include <stdlib.h>
       4             : #include <stdio.h>
       5             : 
       6             : 
       7         132 : int is_socket_list_empty(struct netio_socket_list* list)
       8             : {
       9         132 :     if (list == NULL) {
      10             :         return 1;
      11             :     } else {
      12          52 :         return 0;
      13             :     }
      14             : }
      15             : 
      16             : 
      17         130 : struct netio_socket_list* find_socket_by_address(struct netio_socket_list* list, void* addr, size_t addrlen, int port)
      18             : {
      19         130 :     if (is_socket_list_empty(list) == 1){
      20             :         return NULL;
      21             :     }
      22             :     struct netio_socket_list* iterator  = list;
      23          68 :     while(iterator){
      24          56 :         if( (iterator->addrlen == addrlen) && (iterator->port == port) && (memcmp(iterator->addr, addr, addrlen) == 0) ){
      25             :             return iterator;
      26             :         } else {
      27          16 :             iterator = iterator->next;
      28             :         }
      29             :     }
      30             :     return NULL;
      31             : }
      32             : 
      33             : 
      34           0 : struct netio_socket_list* find_socket(struct netio_socket_list* list, void* socket)
      35             : {
      36           0 :     if (is_socket_list_empty(list) == 1){
      37             :         return NULL;
      38             :     }
      39             :     struct netio_socket_list* iterator  = list;
      40           0 :     while(iterator){
      41           0 :         if(iterator->socket == socket){
      42             :             return iterator;
      43             :         } else {
      44           0 :             iterator = iterator->next;
      45             :         }
      46             :     }
      47             :     return NULL;
      48             : }
      49             : 
      50             : 
      51         320 : struct netio_socket_list* add_socket(struct netio_socket_list** list, int type)
      52             : {
      53         320 :     return add_socket_with_address(list, type, NULL, 0, 0);
      54             : }
      55             : 
      56             : 
      57         365 : struct netio_socket_list* add_socket_with_address(struct netio_socket_list** list, int type, void* addr, size_t addrlen, int port)
      58             : {
      59             :     //check if entry already exists
      60         365 :     if(addrlen > 0){
      61          45 :         struct netio_socket_list* item = find_socket_by_address(*list, addr, addrlen, port);
      62          45 :         if (item != NULL){
      63             :             return item;
      64             :         }
      65             :     }
      66             : 
      67         365 :     struct netio_socket_list* new_item = malloc(sizeof(struct netio_socket_list));
      68             : 
      69         365 :     switch( type )
      70             :     {
      71          24 :         case BSEND:
      72          24 :             new_item->socket = malloc(sizeof(struct netio_buffered_send_socket));
      73          24 :             break;
      74          21 :         case USEND:
      75          21 :             new_item->socket = malloc(sizeof(struct netio_send_socket));
      76          21 :             break;
      77         171 :         case BRECV:
      78         171 :             new_item->socket = malloc(sizeof(struct netio_buffered_recv_socket));
      79         171 :             break;
      80         149 :         case URECV:
      81         149 :             new_item->socket = malloc(sizeof(struct netio_recv_socket));
      82         149 :             break;
      83           0 :         case TESTSOCKET:
      84           0 :             new_item->socket = malloc(sizeof(uint64_t));
      85           0 :             break;
      86           0 :         default :
      87           0 :             log_error("Type of socket %d not supported by socket list", type);
      88           0 :             free(new_item);
      89           0 :             return NULL;
      90             :     }
      91             :     //address
      92         365 :     if(addrlen > 0){
      93          45 :         new_item->addr = malloc(addrlen);
      94          45 :         memcpy(new_item->addr, addr, addrlen);
      95          45 :         new_item->addrlen = addrlen;
      96          45 :         new_item->port = port;
      97             :     } else {
      98         320 :         new_item->addr = NULL;
      99         320 :         new_item->addrlen = 0;
     100         320 :         new_item->port = 0;
     101             :     }
     102         365 :     new_item->next = *list;
     103         365 :     *list = new_item;
     104         365 :     return new_item;
     105             : }
     106             : 
     107             : 
     108         211 : int remove_socket(struct netio_socket_list** list, void* socket)
     109             : {
     110         211 :     int ret = 1;
     111         211 :     struct netio_socket_list* iterator  = *list;
     112         211 :     struct netio_socket_list* previous  = NULL;
     113             : 
     114         219 :     while(iterator){
     115         219 :         if(iterator->socket == socket){
     116         211 :             ret = 0;
     117         211 :             if(previous){
     118           8 :                 previous->next = iterator->next;
     119             :             } else { //in this case we remove the first element
     120         203 :                 *list = iterator->next;
     121             :             }
     122         211 :             if(iterator->addrlen > 0){
     123          39 :                 free(iterator->addr);
     124          39 :                 iterator->addr = NULL;
     125             :             }
     126         211 :             free(iterator->socket);
     127         211 :             iterator->socket = NULL;
     128         211 :             free(iterator);
     129         211 :             break;
     130             :         }
     131             :         else{
     132           8 :             previous = iterator;    
     133           8 :             iterator = iterator->next;
     134             :         }
     135             :     }
     136         211 :     return ret;
     137             : }
     138             : 
     139             : 
     140           0 : int free_socket_list(struct netio_socket_list** list)
     141             : {
     142           0 :     struct netio_socket_list* iterator  = *list;
     143           0 :     int count = 0;
     144           0 :     while (iterator) {
     145           0 :         if(iterator->addrlen > 0){
     146           0 :             free(iterator->addr);
     147           0 :             iterator->addr = NULL;
     148             :         }
     149           0 :         free(iterator->socket);
     150           0 :         iterator->socket = NULL;
     151           0 :         struct netio_socket_list* tmp = iterator;
     152           0 :         iterator = iterator->next;
     153           0 :         free(tmp);
     154           0 :         ++count;
     155             :     }
     156           0 :     *list = NULL;
     157           0 :     return count;
     158             : }
     159             : 
     160             : 
     161           0 : int print_sockets(struct netio_socket_list* list)
     162             : {
     163           0 :     int counter = 0;
     164           0 :     struct netio_socket_list* iterator = list;
     165           0 :     while(iterator){
     166           0 :         log_info("Element %d socket addr %p \n", counter, iterator->socket);
     167           0 :         iterator = iterator->next;
     168           0 :         ++counter;
     169             :     }
     170           0 :     return counter;
     171             : }

Generated by: LCOV version 1.0