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 : }