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