LCOV - code coverage report
Current view: top level - netio-next/src - socket_list.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 58 94 61.7 %
Date: 2025-06-10 03:23:28 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         204 : int is_socket_list_empty(struct netio_socket_list* list)
       8             : {
       9         204 :     if (list == NULL) {
      10             :         return 1;
      11             :     } else {
      12          64 :         return 0;
      13             :     }
      14             : }
      15             : 
      16             : 
      17         200 : struct netio_socket_list* find_socket_by_address(struct netio_socket_list* list, void* addr, size_t addrlen)
      18             : {
      19         200 :     if (is_socket_list_empty(list) == 1){
      20             :         return NULL;
      21             :     }
      22             :     struct netio_socket_list* iterator  = list;
      23          81 :     while(iterator){
      24          67 :         if( (iterator->addrlen == addrlen) && (memcmp(iterator->addr, addr, addrlen) == 0) ){
      25          50 :             return iterator;
      26             :         } else {
      27          17 :             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           0 :             return iterator;
      43             :         } else {
      44           0 :             iterator = iterator->next;
      45             :         }
      46             :     }
      47             :     return NULL;
      48             : }
      49             : 
      50             : 
      51         463 : struct netio_socket_list* add_socket(struct netio_socket_list** list, int type)
      52             : {
      53         463 :     return add_socket_with_address(list, type, NULL, 0);
      54             : }
      55             : 
      56             : 
      57         538 : struct netio_socket_list* add_socket_with_address(struct netio_socket_list** list, int type, void* addr, size_t addrlen)
      58             : {
      59             :     //check if entry already exists
      60         538 :     if(addrlen > 0){
      61          75 :         struct netio_socket_list* item = find_socket_by_address(*list, addr, addrlen);
      62          75 :         if (item != NULL){
      63             :             return item;
      64             :         }
      65             :     }
      66             : 
      67         538 :     struct netio_socket_list* new_item = malloc(sizeof(struct netio_socket_list));
      68             : 
      69         538 :     switch( type )
      70             :     {
      71          43 :         case BSEND:
      72          43 :             new_item->socket = malloc(sizeof(struct netio_buffered_send_socket));
      73          43 :             break;
      74          32 :         case USEND:
      75          32 :             new_item->socket = malloc(sizeof(struct netio_send_socket));
      76          32 :             break;
      77         252 :         case BRECV:
      78         252 :             new_item->socket = malloc(sizeof(struct netio_buffered_recv_socket));
      79         252 :             break;
      80         211 :         case URECV:
      81         211 :             new_item->socket = malloc(sizeof(struct netio_recv_socket));
      82         211 :             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         538 :     if(addrlen > 0){
      93          75 :         new_item->addr = malloc(addrlen);
      94          75 :         memcpy(new_item->addr, addr, addrlen);
      95          75 :         new_item->addrlen = addrlen;
      96             :     } else {
      97         463 :         new_item->addr = NULL;
      98         463 :         new_item->addrlen = 0;
      99             :     }
     100         538 :     new_item->next = *list;
     101         538 :     *list = new_item;
     102         538 :     return new_item;
     103             : }
     104             : 
     105             : 
     106         411 : int remove_socket(struct netio_socket_list** list, void* socket)
     107             : {
     108         411 :     int ret = 1;
     109         411 :     struct netio_socket_list* iterator  = *list;
     110         411 :     struct netio_socket_list* previous  = NULL;
     111             : 
     112         417 :     while(iterator){
     113         417 :         if(iterator->socket == socket){
     114         411 :             ret = 0;
     115         411 :             if(previous){
     116           6 :                 previous->next = iterator->next;
     117             :             } else { //in this case we remove the first element
     118         405 :                 *list = iterator->next;
     119             :             }
     120         411 :             if(iterator->addrlen > 0){
     121          61 :                 free(iterator->addr);
     122          61 :                 iterator->addr = NULL;
     123             :             }
     124         411 :             free(iterator->socket);
     125         411 :             iterator->socket = NULL;
     126         411 :             free(iterator);
     127         411 :             break;
     128             :         }
     129             :         else{
     130           6 :             previous = iterator;    
     131           6 :             iterator = iterator->next;
     132             :         }
     133             :     }
     134         411 :     return ret;
     135             : }
     136             : 
     137             : 
     138           0 : int free_socket_list(struct netio_socket_list** list)
     139             : {
     140           0 :     struct netio_socket_list* iterator  = *list;
     141           0 :     int count = 0;
     142           0 :     while (iterator) {
     143           0 :         if(iterator->addrlen > 0){
     144           0 :             free(iterator->addr);
     145           0 :             iterator->addr = NULL;
     146             :         }
     147           0 :         free(iterator->socket);
     148           0 :         iterator->socket = NULL;
     149           0 :         struct netio_socket_list* tmp = iterator;
     150           0 :         iterator = iterator->next;
     151           0 :         free(tmp);
     152           0 :         ++count;
     153             :     }
     154           0 :     *list = NULL;
     155           0 :     return count;
     156             : }
     157             : 
     158             : 
     159           0 : int print_sockets(struct netio_socket_list* list)
     160             : {
     161           0 :     int counter = 0;
     162           0 :     struct netio_socket_list* iterator = list;
     163           0 :     while(iterator){
     164           0 :         log_info("Element %d socket addr %p \n", counter, iterator->socket);
     165           0 :         iterator = iterator->next;
     166           0 :         ++counter;
     167             :     }
     168           0 :     return counter;
     169             : }

Generated by: LCOV version 1.0