LCOV - code coverage report
Current view: top level - src - socket_list.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 51 82 62.2 %
Date: 2025-11-26 02:09:04 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          36 : int is_socket_list_empty(struct netio_socket_list* list)
       8             : {
       9          36 :     if (list == NULL) {
      10             :         return 1;
      11             :     } else {
      12          12 :         return 0;
      13             :     }
      14             : }
      15             : 
      16             : 
      17          34 : struct netio_socket_list* find_socket_by_address(struct netio_socket_list* list, void* addr, size_t addrlen, int port)
      18             : {
      19          34 :     if (is_socket_list_empty(list) == 1){
      20             :         return NULL;
      21             :     }
      22             :     struct netio_socket_list* iterator  = list;
      23          16 :     while(iterator){
      24          12 :         if( (iterator->addrlen == addrlen) && (iterator->port == port) && (memcmp(iterator->addr, addr, addrlen) == 0) ){
      25             :             return iterator;
      26             :         } else {
      27           4 :             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          90 : struct netio_socket_list* add_socket(struct netio_socket_list** list, int type)
      52             : {
      53          90 :     return add_socket_with_address(list, type, NULL, 0, 0);
      54             : }
      55             : 
      56             : 
      57         103 : 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         103 :     if(addrlen > 0){
      61          13 :         struct netio_socket_list* item = find_socket_by_address(*list, addr, addrlen, port);
      62          13 :         if (item != NULL){
      63             :             return item;
      64             :         }
      65             :     }
      66             : 
      67         103 :     struct netio_socket_list* new_item = malloc(sizeof(struct netio_socket_list));
      68             : 
      69         103 :     switch( type )
      70             :     {
      71           6 :         case BSEND:
      72           6 :             new_item->socket = malloc(sizeof(struct netio_buffered_send_socket));
      73           6 :             break;
      74           7 :         case USEND:
      75           7 :             new_item->socket = malloc(sizeof(struct netio_send_socket));
      76           7 :             break;
      77          58 :         case BRECV:
      78          58 :             new_item->socket = malloc(sizeof(struct netio_buffered_recv_socket));
      79          58 :             break;
      80          32 :         case URECV:
      81          32 :             new_item->socket = malloc(sizeof(struct netio_recv_socket));
      82          32 :             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         103 :     if(addrlen > 0){
      93          13 :         new_item->addr = malloc(addrlen);
      94          13 :         memcpy(new_item->addr, addr, addrlen);
      95          13 :         new_item->addrlen = addrlen;
      96          13 :         new_item->port = port;
      97             :     } else {
      98          90 :         new_item->addr = NULL;
      99          90 :         new_item->addrlen = 0;
     100          90 :         new_item->port = 0;
     101             :     }
     102         103 :     new_item->next = *list;
     103         103 :     *list = new_item;
     104         103 :     return new_item;
     105             : }
     106             : 
     107             : 
     108          41 : int remove_socket(struct netio_socket_list** list, void* socket)
     109             : {
     110             :     int ret = 1;
     111          41 :     struct netio_socket_list* iterator  = *list;
     112             :     struct netio_socket_list* previous  = NULL;
     113             : 
     114          41 :     while(iterator){
     115          41 :         if(iterator->socket == socket){
     116             :             ret = 0;
     117          41 :             if(previous){
     118           0 :                 previous->next = iterator->next;
     119             :             } else { //in this case we remove the first element
     120          41 :                 *list = iterator->next;
     121             :             }
     122          41 :             if(iterator->addrlen > 0){
     123           7 :                 free(iterator->addr);
     124             :                 iterator->addr = NULL;
     125             :             }
     126          41 :             free(iterator->socket);
     127             :             iterator->socket = NULL;
     128          41 :             free(iterator);
     129          41 :             break;
     130             :         }
     131             :         else{
     132             :             previous = iterator;    
     133           0 :             iterator = iterator->next;
     134             :         }
     135             :     }
     136          41 :     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             :     int count = 0;
     144           0 :     while (iterator) {
     145           0 :         if(iterator->addrlen > 0){
     146           0 :             free(iterator->addr);
     147             :             iterator->addr = NULL;
     148             :         }
     149           0 :         free(iterator->socket);
     150             :         iterator->socket = NULL;
     151             :         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             :     int counter = 0;
     164             :     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