aboutsummaryrefslogtreecommitdiff
path: root/src/service/messenger/messenger_api_list_tunnels.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/messenger/messenger_api_list_tunnels.c')
-rw-r--r--src/service/messenger/messenger_api_list_tunnels.c130
1 files changed, 87 insertions, 43 deletions
diff --git a/src/service/messenger/messenger_api_list_tunnels.c b/src/service/messenger/messenger_api_list_tunnels.c
index a4126c286..b2513370c 100644
--- a/src/service/messenger/messenger_api_list_tunnels.c
+++ b/src/service/messenger/messenger_api_list_tunnels.c
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 Copyright (C) 2020--2021 GNUnet e.V. 3 Copyright (C) 2020--2023 GNUnet e.V.
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published 6 under the terms of the GNU Affero General Public License as published
@@ -29,30 +29,27 @@
29void 29void
30init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels) 30init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
31{ 31{
32 GNUNET_assert(tunnels); 32 GNUNET_assert (tunnels);
33 33
34 tunnels->head = NULL; 34 tunnels->head = NULL;
35 tunnels->tail = NULL; 35 tunnels->tail = NULL;
36} 36}
37 37
38
38void 39void
39clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels) 40clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
40{ 41{
41 GNUNET_assert(tunnels); 42 GNUNET_assert (tunnels);
42 43
43 struct GNUNET_MESSENGER_ListTunnel *element; 44 struct GNUNET_MESSENGER_ListTunnel *element;
45 for (element = tunnels->head; element; element = remove_from_list_tunnels (
46 tunnels, element))
44 47
45 for (element = tunnels->head; element; element = tunnels->head) 48 tunnels->head = NULL;
46 {
47 GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
48 GNUNET_PEER_change_rc (element->peer, -1);
49 GNUNET_free(element);
50 }
51
52 tunnels->head = NULL;
53 tunnels->tail = NULL; 49 tunnels->tail = NULL;
54} 50}
55 51
52
56static int 53static int
57compare_list_tunnels (void *cls, 54compare_list_tunnels (void *cls,
58 struct GNUNET_MESSENGER_ListTunnel *element0, 55 struct GNUNET_MESSENGER_ListTunnel *element0,
@@ -61,26 +58,33 @@ compare_list_tunnels (void *cls,
61 return ((int) element0->peer) - ((int) element1->peer); 58 return ((int) element0->peer) - ((int) element1->peer);
62} 59}
63 60
61
64void 62void
65add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 63add_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
66 const struct GNUNET_PeerIdentity *peer) 64 const struct GNUNET_PeerIdentity *peer,
65 const struct GNUNET_HashCode *hash)
67{ 66{
68 GNUNET_assert((tunnels) && (peer)); 67 GNUNET_assert ((tunnels) && (peer));
69 68
70 struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new(struct GNUNET_MESSENGER_ListTunnel); 69 struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new (struct
70 GNUNET_MESSENGER_ListTunnel);
71 71
72 element->peer = GNUNET_PEER_intern (peer); 72 element->peer = GNUNET_PEER_intern (peer);
73 element->hash = hash ? GNUNET_memdup (hash, sizeof(struct GNUNET_HashCode)) :
74 NULL;
73 75
74 GNUNET_CONTAINER_DLL_insert_sorted(struct GNUNET_MESSENGER_ListTunnel, compare_list_tunnels, NULL, tunnels->head, 76 GNUNET_CONTAINER_DLL_insert_sorted (struct GNUNET_MESSENGER_ListTunnel,
75 tunnels->tail, element); 77 compare_list_tunnels, NULL, tunnels->head,
78 tunnels->tail, element);
76} 79}
77 80
81
78struct GNUNET_MESSENGER_ListTunnel* 82struct GNUNET_MESSENGER_ListTunnel*
79find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 83find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
80 const struct GNUNET_PeerIdentity *peer, 84 const struct GNUNET_PeerIdentity *peer,
81 size_t *index) 85 size_t *index)
82{ 86{
83 GNUNET_assert((tunnels) && (peer)); 87 GNUNET_assert ((tunnels) && (peer));
84 88
85 struct GNUNET_MESSENGER_ListTunnel *element; 89 struct GNUNET_MESSENGER_ListTunnel *element;
86 struct GNUNET_PeerIdentity pid; 90 struct GNUNET_PeerIdentity pid;
@@ -92,7 +96,7 @@ find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
92 { 96 {
93 GNUNET_PEER_resolve (element->peer, &pid); 97 GNUNET_PEER_resolve (element->peer, &pid);
94 98
95 if (0 == GNUNET_memcmp(&pid, peer)) 99 if (0 == GNUNET_memcmp (&pid, peer))
96 return element; 100 return element;
97 101
98 if (index) 102 if (index)
@@ -102,81 +106,121 @@ find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
102 return NULL; 106 return NULL;
103} 107}
104 108
109
110void
111update_to_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
112 const struct GNUNET_PeerIdentity *peer,
113 const struct GNUNET_HashCode *hash)
114{
115 GNUNET_assert ((tunnels) && (peer));
116
117 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (tunnels,
118 peer,
119 NULL);
120 if (! element)
121 return;
122
123 if (element->hash)
124 {
125 if (hash)
126 GNUNET_memcpy (element->hash, hash, sizeof(struct GNUNET_HashCode));
127 else
128 {
129 GNUNET_free (element->hash);
130 element->hash = NULL;
131 }
132 }
133 else if (hash)
134 element->hash = GNUNET_memdup (hash, sizeof(struct GNUNET_HashCode));
135}
136
137
105int 138int
106contains_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 139contains_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
107 const struct GNUNET_PeerIdentity *peer) 140 const struct GNUNET_PeerIdentity *peer)
108{ 141{
109 GNUNET_assert((tunnels) && (peer)); 142 GNUNET_assert ((tunnels) && (peer));
110 143
111 return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : GNUNET_NO; 144 return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES :
145 GNUNET_NO;
112} 146}
113 147
148
114struct GNUNET_MESSENGER_ListTunnel* 149struct GNUNET_MESSENGER_ListTunnel*
115remove_from_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 150remove_from_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
116 struct GNUNET_MESSENGER_ListTunnel *element) 151 struct GNUNET_MESSENGER_ListTunnel *element)
117{ 152{
118 GNUNET_assert((tunnels) && (element)); 153 GNUNET_assert ((tunnels) && (element));
119 154
120 struct GNUNET_MESSENGER_ListTunnel *next = element->next; 155 struct GNUNET_MESSENGER_ListTunnel *next = element->next;
121 156
122 GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element); 157 if ((tunnels->head) && (tunnels->tail))
158 GNUNET_CONTAINER_DLL_remove (tunnels->head, tunnels->tail, element);
159
160 if (element->hash)
161 GNUNET_free (element->hash);
162
123 GNUNET_PEER_change_rc (element->peer, -1); 163 GNUNET_PEER_change_rc (element->peer, -1);
124 GNUNET_free(element); 164 GNUNET_free (element);
125 165
126 return next; 166 return next;
127} 167}
128 168
169
129void 170void
130load_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 171load_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
131 const char *path) 172 const char *path)
132{ 173{
133 GNUNET_assert((tunnels) && (path)); 174 GNUNET_assert ((tunnels) && (path));
134 175
135 if (GNUNET_YES != GNUNET_DISK_file_test (path)) 176 if (GNUNET_YES != GNUNET_DISK_file_test (path))
136 return; 177 return;
137 178
138 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); 179 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
180 | GNUNET_DISK_PERM_USER_WRITE);
139 181
140 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open( 182 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
141 path, GNUNET_DISK_OPEN_READ, permission 183 path, GNUNET_DISK_OPEN_READ, permission
142 ); 184 );
143 185
144 if (!handle) 186 if (! handle)
145 return; 187 return;
146 188
147 GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET); 189 GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
148 190
149 struct GNUNET_PeerIdentity peer; 191 struct GNUNET_PeerIdentity peer;
150 ssize_t len; 192 ssize_t len;
151 193
152 do { 194 do {
153 len = GNUNET_DISK_file_read(handle, &peer, sizeof(peer)); 195 len = GNUNET_DISK_file_read (handle, &peer, sizeof(peer));
154 196
155 if (len != sizeof(peer)) 197 if (len != sizeof(peer))
156 break; 198 break;
157 199
158 add_to_list_tunnels(tunnels, &peer); 200 add_to_list_tunnels (tunnels, &peer, NULL);
159 } while (len == sizeof(peer)); 201 } while (len == sizeof(peer));
160 202
161 GNUNET_DISK_file_close(handle); 203 GNUNET_DISK_file_close (handle);
162} 204}
163 205
206
164void 207void
165save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, 208save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
166 const char *path) 209 const char *path)
167{ 210{
168 GNUNET_assert((tunnels) && (path)); 211 GNUNET_assert ((tunnels) && (path));
169 212
170 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); 213 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
214 | GNUNET_DISK_PERM_USER_WRITE);
171 215
172 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open( 216 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
173 path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission 217 path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
174 ); 218 );
175 219
176 if (!handle) 220 if (! handle)
177 return; 221 return;
178 222
179 GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET); 223 GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
180 224
181 struct GNUNET_MESSENGER_ListTunnel *element; 225 struct GNUNET_MESSENGER_ListTunnel *element;
182 struct GNUNET_PeerIdentity pid; 226 struct GNUNET_PeerIdentity pid;
@@ -185,9 +229,9 @@ save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels,
185 { 229 {
186 GNUNET_PEER_resolve (element->peer, &pid); 230 GNUNET_PEER_resolve (element->peer, &pid);
187 231
188 GNUNET_DISK_file_write(handle, &pid, sizeof(pid)); 232 GNUNET_DISK_file_write (handle, &pid, sizeof(pid));
189 } 233 }
190 234
191 GNUNET_DISK_file_sync(handle); 235 GNUNET_DISK_file_sync (handle);
192 GNUNET_DISK_file_close(handle); 236 GNUNET_DISK_file_close (handle);
193} 237}