LCOV - code coverage report
Current view: top level - lib - connpool.c (source / functions) Hit Total Coverage
Test: smtpd.info Lines: 41 53 77.4 %
Date: 2015-11-25 19:06:20 Functions: 3 4 75.0 %

          Line data    Source code
       1             : /* This file is part of the cmail project (http://cmail.rocks/)
       2             :  * (c) 2015 Fabian "cbdev" Stumpf
       3             :  * License: Simplified BSD (2-Clause)
       4             :  * For further information, consult LICENSE.txt
       5             :  */
       6             : 
       7          21 : int connpool_add(CONNPOOL* pool, int fd){
       8             :         unsigned i;
       9             :         int free_slot;
      10          21 :         CONNECTION new_connection = {
      11             :                 #ifndef CMAIL_NO_TLS
      12             :                 .tls_mode=TLS_NONE,
      13             :                 #endif
      14             :                 .fd = -1,
      15             :                 .aux_data = NULL
      16             :         };
      17             : 
      18          21 :         if(fd < 0 || !pool){
      19           0 :                 return -1;
      20             :         }
      21             : 
      22          21 :         new_connection.fd = fd;
      23             : 
      24             :         //initialize if needed
      25          21 :         if(!pool->conns){
      26           2 :                 pool->conns = malloc(sizeof(CONNECTION));
      27           2 :                 if(!pool->conns){
      28           0 :                         return -127;
      29             :                 }
      30             : 
      31           2 :                 pool->conns[0] = new_connection;
      32           2 :                 pool->count = 1;
      33           2 :                 return 0;
      34             :         }
      35             : 
      36             :         //check if already in set, search for free slots at same time
      37          19 :         free_slot = -1;
      38          36 :         for(i = 0; i < pool->count; i++){
      39          30 :                 if(pool->conns[i].fd == fd){
      40           0 :                         return i;
      41             :                 }
      42          30 :                 if(pool->conns[i].fd == -1){
      43          13 :                         free_slot = i;
      44          13 :                         new_connection.aux_data = pool->conns[free_slot].aux_data;
      45          13 :                         break;
      46             :                 }
      47             :         }
      48             : 
      49             :         //reallocate if needed
      50          19 :         if(free_slot < 0){
      51           6 :                 pool->conns = realloc(pool->conns, sizeof(CONNECTION) * ((pool->count) + 1));
      52           6 :                 if(!pool->conns){
      53           0 :                         return -127;
      54             :                 }
      55             : 
      56           6 :                 free_slot = pool->count++;
      57             :         }
      58             : 
      59          19 :         pool->conns[free_slot] = new_connection;
      60             : 
      61          19 :         return free_slot;
      62             : }
      63             : 
      64           0 : int connpool_remove(CONNPOOL* pool, int fd){
      65             :         unsigned i;
      66             : 
      67           0 :         if(fd < 0 || !pool || !(pool->conns)){
      68           0 :                 return -1;
      69             :         }
      70             : 
      71           0 :         for(i = 0; i < pool->count; i++){
      72           0 :                 if(pool->conns[i].fd == fd){
      73           0 :                         pool->conns[i].fd = -1;
      74           0 :                         return 0;
      75             :                 }
      76             :         }
      77             : 
      78           0 :         return 1;
      79             : }
      80             : 
      81          15 : int connpool_active(CONNPOOL pool){
      82          15 :         unsigned i, count = 0;
      83             : 
      84          36 :         for(i = 0; i < pool.count; i++){
      85          21 :                 if(pool.conns[i].fd >= 0){
      86           2 :                         count++;
      87             :                 }
      88             :         }
      89             : 
      90          15 :         return count;
      91             : }
      92             : 
      93           3 : void connpool_free(CONNPOOL* pool){
      94             :         unsigned i;
      95             : 
      96           3 :         if(!pool){
      97           3 :                 return;
      98             :         }
      99             : 
     100           3 :         if(pool->conns){
     101          17 :                 for(i = 0; i < pool->count; i++){
     102          14 :                         if(pool->conns[i].fd >= 0){
     103          12 :                                 close(pool->conns[i].fd);
     104             :                         }
     105             : 
     106          14 :                         if(pool->conns[i].aux_data){
     107          14 :                                 free(pool->conns[i].aux_data);
     108             :                         }
     109             :                 }
     110             : 
     111           3 :                 free(pool->conns);
     112           3 :                 pool->conns = NULL;
     113             :         }
     114             : 
     115           3 :         pool->count = 0;
     116             : }

Generated by: LCOV version 1.11