GNUnet 0.21.1
messenger_api_list_tunnels.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2020--2024 GNUnet e.V.
4
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
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
27
28void
30{
31 GNUNET_assert (tunnels);
32
33 tunnels->head = NULL;
34 tunnels->tail = NULL;
35}
36
37
38void
40{
41 GNUNET_assert (tunnels);
42
43 struct GNUNET_MESSENGER_ListTunnel *element;
44 for (element = tunnels->head; element;
45 element = remove_from_list_tunnels (tunnels, element))
46
47 tunnels->head = NULL;
48 tunnels->tail = NULL;
49}
50
51
52static int
54 struct GNUNET_MESSENGER_ListTunnel *element0,
55 struct GNUNET_MESSENGER_ListTunnel *element1)
56{
57 struct GNUNET_PeerIdentity peer0, peer1;
58
59 GNUNET_PEER_resolve (element0->peer, &peer0);
60 GNUNET_PEER_resolve (element1->peer, &peer1);
61
62 return GNUNET_memcmp (&peer0, &peer1);
63}
64
65
66void
68 const struct GNUNET_PeerIdentity *peer,
69 const struct GNUNET_HashCode *hash)
70{
71 GNUNET_assert ((tunnels) && (peer));
72
73 struct GNUNET_MESSENGER_ListTunnel *element = GNUNET_new (struct
75
76 element->peer = GNUNET_PEER_intern (peer);
77 element->hash = hash ? GNUNET_memdup (hash, sizeof (struct GNUNET_HashCode)) :
78 NULL;
79
80 memset (&(element->connection), 0, sizeof (element->connection));
81
83 compare_list_tunnels, NULL, tunnels->head,
84 tunnels->tail, element);
85}
86
87
90 const struct GNUNET_PeerIdentity *peer,
91 size_t *index)
92{
93 GNUNET_assert ((tunnels) && (peer));
94
95 struct GNUNET_MESSENGER_ListTunnel *element;
97
98 if (index)
99 *index = 0;
100
101 for (element = tunnels->head; element; element = element->next)
102 {
103 GNUNET_PEER_resolve (element->peer, &pid);
104
105 if (0 == GNUNET_memcmp (&pid, peer))
106 return element;
107
108 if (index)
109 (*index) = (*index) + 1;
110 }
111
112 return NULL;
113}
114
115
118 const struct GNUNET_PeerIdentity *peer)
119{
120 GNUNET_assert ((tunnels) && (peer));
121
122 struct GNUNET_MESSENGER_ListTunnel *element;
124
125 for (element = tunnels->head; element; element = element->next)
126 {
127 GNUNET_PEER_resolve (element->peer, &pid);
128
129 if (0 != GNUNET_memcmp (&pid, peer))
130 return element;
131 }
132
133 return NULL;
134}
135
136
140 const struct GNUNET_PeerIdentity *peer,
142{
143 GNUNET_assert ((tunnels) && (peer) && (flag));
144
145 struct GNUNET_MESSENGER_ListTunnel *element;
147
148 for (element = tunnels->head; element; element = element->next)
149 {
150 if ((element->connection.flags & flag) != flag)
151 continue;
152
153 GNUNET_PEER_resolve (element->peer, &pid);
154
155 if (0 == GNUNET_memcmp (&pid, peer))
156 return GNUNET_OK;
157 }
158
159 return GNUNET_SYSERR;
160}
161
162
163void
165 const struct GNUNET_PeerIdentity *peer,
166 const struct GNUNET_HashCode *hash)
167{
168 GNUNET_assert ((tunnels) && (peer));
169
170 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (tunnels,
171 peer,
172 NULL);
173 if (! element)
174 return;
175
176 if (element->hash)
177 {
178 if (hash)
179 GNUNET_memcpy (element->hash, hash, sizeof(struct GNUNET_HashCode));
180 else
181 {
182 GNUNET_free (element->hash);
183 element->hash = NULL;
184 }
185 }
186 else if (hash)
187 element->hash = GNUNET_memdup (hash, sizeof(struct GNUNET_HashCode));
188}
189
190
193 const struct GNUNET_PeerIdentity *peer)
194{
195 GNUNET_assert ((tunnels) && (peer));
196
197 return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES :
198 GNUNET_NO;
199}
200
201
204 struct GNUNET_MESSENGER_ListTunnel *element)
205{
206 GNUNET_assert ((tunnels) && (element));
207
208 struct GNUNET_MESSENGER_ListTunnel *next = element->next;
209
210 if ((tunnels->head) && (tunnels->tail))
211 GNUNET_CONTAINER_DLL_remove (tunnels->head, tunnels->tail, element);
212
213 if (element->hash)
214 GNUNET_free (element->hash);
215
216 GNUNET_PEER_change_rc (element->peer, -1);
217 GNUNET_free (element);
218
219 return next;
220}
221
222
223void
225 const char *path)
226{
227 GNUNET_assert ((tunnels) && (path));
228
229 if (GNUNET_YES != GNUNET_DISK_file_test (path))
230 return;
231
232 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Load list of tunnels from path: %s\n",
233 path);
234
237
239 path, GNUNET_DISK_OPEN_READ, permission
240 );
241
242 if (! handle)
243 return;
244
246
247 struct GNUNET_PeerIdentity peer;
248 ssize_t len;
249
250 do {
251 len = GNUNET_DISK_file_read (handle, &peer, sizeof(peer));
252
253 if (len != sizeof(peer))
254 break;
255
256 add_to_list_tunnels (tunnels, &peer, NULL);
257 } while (len == sizeof(peer));
258
260}
261
262
263void
265 const char *path)
266{
267 GNUNET_assert ((tunnels) && (path));
268
269 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Save list of tunnels to path: %s\n",
270 path);
271
274
277 );
278
279 if (! handle)
280 return;
281
283
284 struct GNUNET_MESSENGER_ListTunnel *element;
286
287 for (element = tunnels->head; element; element = element->next)
288 {
289 GNUNET_PEER_resolve (element->peer, &pid);
290
292 }
293
296}
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition: gnunet-vpn.c:35
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1237
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition: disk.c:482
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:686
off_t GNUNET_DISK_file_seek(const struct GNUNET_DISK_FileHandle *h, off_t offset, enum GNUNET_DISK_Seek whence)
Move the read/write pointer in a file.
Definition: disk.c:205
GNUNET_DISK_AccessPermissions
File access permissions, UNIX-style.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition: disk.c:1427
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1308
ssize_t GNUNET_DISK_file_read(const struct GNUNET_DISK_FileHandle *h, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition: disk.c:622
@ GNUNET_DISK_OPEN_READ
Open the file for reading.
@ GNUNET_DISK_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
@ GNUNET_DISK_SEEK_SET
Seek an absolute position (from the start of the file).
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_log(kind,...)
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_CONTAINER_DLL_insert_sorted(TYPE, comparator, comparator_cls, head, tail, element)
Insertion sort of element into DLL from head to tail sorted by comparator.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_memdup(buf, size)
Allocate and initialize a block of memory.
GNUNET_MESSENGER_ConnectionFlags
Enum for the different supported flags used to specify connection handling.
void GNUNET_PEER_change_rc(GNUNET_PEER_Id id, int delta)
Change the reference counter of an interned PID.
Definition: peer.c:192
void GNUNET_PEER_resolve(GNUNET_PEER_Id id, struct GNUNET_PeerIdentity *pid)
Convert an interned PID to a normal peer identity.
Definition: peer.c:220
GNUNET_PEER_Id GNUNET_PEER_intern(const struct GNUNET_PeerIdentity *pid)
Intern an peer identity.
Definition: peer.c:108
void load_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const char *path)
Loads the list of tunnels peer identities from a file under a given path.
struct GNUNET_MESSENGER_ListTunnel * find_list_tunnels_alternate(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer)
Searches linearly through the list of tunnels peer identities for matching against a specific peer id...
void init_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Initializes list of tunnels peer identities as empty list.
void save_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const char *path)
Saves the list of tunnels peer identities to a file under a given path.
static int compare_list_tunnels(void *cls, struct GNUNET_MESSENGER_ListTunnel *element0, struct GNUNET_MESSENGER_ListTunnel *element1)
void update_to_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HashCode *hash)
Updates a specific peer from a tunnel in the list.
enum GNUNET_GenericReturnValue verify_list_tunnels_flag_token(const struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, enum GNUNET_MESSENGER_ConnectionFlags flag)
Verifies that a specific tunnel selected by its peer identity in a list of tunnels is the first in or...
void add_to_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HashCode *hash)
Adds a specific peer from a tunnel to the end of the list.
struct GNUNET_MESSENGER_ListTunnel * find_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, size_t *index)
Searches linearly through the list of tunnels peer identities for matching a specific peer identity a...
void clear_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Clears the list of tunnels peer identities.
enum GNUNET_GenericReturnValue contains_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer)
Tests linearly if the list of tunnels peer identities contains a specific peer identity and returns G...
struct GNUNET_MESSENGER_ListTunnel * remove_from_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, struct GNUNET_MESSENGER_ListTunnel *element)
Removes a specific element from the list of tunnels peer identities and returns the next element in t...
Handle used to access files (and pipes).
A 512-bit hashcode.
struct GNUNET_MESSENGER_ListTunnel * next
struct GNUNET_MESSENGER_MessageConnection connection
struct GNUNET_MESSENGER_ListTunnel * tail
struct GNUNET_MESSENGER_ListTunnel * head
uint32_t flags
The flags about the connections of a peer.
The identity of the host (wraps the signing key of the peer).