GNUnet  0.11.x
messenger_api_list_tunnels.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2020--2021 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 
28 void
30 {
31  GNUNET_assert(tunnels);
32 
33  tunnels->head = NULL;
34  tunnels->tail = NULL;
35 }
36 
37 void
39 {
40  GNUNET_assert(tunnels);
41 
42  struct GNUNET_MESSENGER_ListTunnel *element;
43 
44  for (element = tunnels->head; element; element = tunnels->head)
45  {
46  GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
47  GNUNET_PEER_change_rc (element->peer, -1);
48  GNUNET_free(element);
49  }
50 
51  tunnels->head = NULL;
52  tunnels->tail = NULL;
53 }
54 
55 static int
57  struct GNUNET_MESSENGER_ListTunnel *element1)
58 {
59  return ((int) element0->peer) - ((int) element1->peer);
60 }
61 
62 void
64 {
65  GNUNET_assert((tunnels) && (peer));
66 
68 
69  element->peer = GNUNET_PEER_intern (peer);
70 
72  tunnels->tail, element);
73 }
74 
76 find_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer, size_t *index)
77 {
78  GNUNET_assert((tunnels) && (peer));
79 
80  struct GNUNET_MESSENGER_ListTunnel *element;
81  struct GNUNET_PeerIdentity pid;
82 
83  if (index)
84  *index = 0;
85 
86  for (element = tunnels->head; element; element = element->next)
87  {
88  GNUNET_PEER_resolve (element->peer, &pid);
89 
90  if (0 == GNUNET_memcmp(&pid, peer))
91  return element;
92 
93  if (index)
94  (*index) = (*index) + 1;
95  }
96 
97  return NULL;
98 }
99 
100 int
102 {
103  GNUNET_assert((tunnels) && (peer));
104 
105  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : GNUNET_NO;
106 }
107 
110 {
111  GNUNET_assert((tunnels) && (element));
112 
113  struct GNUNET_MESSENGER_ListTunnel *next = element->next;
114 
115  GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
116  GNUNET_PEER_change_rc (element->peer, -1);
117  GNUNET_free(element);
118 
119  return next;
120 }
121 
122 void
123 load_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const char *path)
124 {
125  GNUNET_assert((tunnels) && (path));
126 
127  if (GNUNET_YES != GNUNET_DISK_file_test (path))
128  return;
129 
131 
133  path, GNUNET_DISK_OPEN_READ, permission
134  );
135 
136  if (!handle)
137  return;
138 
140 
141  struct GNUNET_PeerIdentity peer;
142  ssize_t len;
143 
144  do {
145  len = GNUNET_DISK_file_read(handle, &peer, sizeof(peer));
146 
147  if (len != sizeof(peer))
148  break;
149 
150  add_to_list_tunnels(tunnels, &peer);
151  } while (len == sizeof(peer));
152 
153  GNUNET_DISK_file_close(handle);
154 }
155 
156 void
157 save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels, const char *path)
158 {
159  GNUNET_assert((tunnels) && (path));
160 
162 
165  );
166 
167  if (!handle)
168  return;
169 
171 
172  struct GNUNET_MESSENGER_ListTunnel *element;
173  struct GNUNET_PeerIdentity pid;
174 
175  for (element = tunnels->head; element; element = element->next)
176  {
177  GNUNET_PEER_resolve (element->peer, &pid);
178 
179  GNUNET_DISK_file_write(handle, &pid, sizeof(pid));
180  }
181 
182  GNUNET_DISK_file_sync(handle);
183  GNUNET_DISK_file_close(handle);
184 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Open the file for reading.
Create file if it doesn&#39;t exist.
int 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...
#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.
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
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1305
struct GNUNET_MESSENGER_ListTunnel * head
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.
struct GNUNET_MESSENGER_ListTunnel * next
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void add_to_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels, const struct GNUNET_PeerIdentity *peer)
Adds a specific peer from a tunnel to the end of the list.
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:206
void GNUNET_PEER_resolve(GNUNET_PEER_Id id, struct GNUNET_PeerIdentity *pid)
Convert an interned PID to a normal peer identity.
Definition: peer.c:225
static int compare_list_tunnels(void *cls, struct GNUNET_MESSENGER_ListTunnel *element0, struct GNUNET_MESSENGER_ListTunnel *element1)
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
void clear_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Clears the list of tunnels peer identities.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
GNUNET_DISK_AccessPermissions
File access permissions, UNIX-style.
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_TESTBED_Peer * peer
The peer associated with this model.
Open the file for writing.
struct GNUNET_MESSENGER_ListTunnel * tail
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
The identity of the host (wraps the signing key of the peer).
Seek an absolute position (from the start of the file).
void init_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Initializes list of tunnels peer identities as empty list.
messenger api: client and service implementation of GNUnet MESSENGER service
enum GNUNET_GenericReturnValue GNUNET_DISK_file_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition: disk.c:1424
void GNUNET_PEER_change_rc(GNUNET_PEER_Id id, int delta)
Change the reference counter of an interned PID.
Definition: peer.c:197
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:1234
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...
Handle used to access files (and pipes).
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
GNUNET_PEER_Id GNUNET_PEER_intern(const struct GNUNET_PeerIdentity *pid)
Intern an peer identity.
Definition: peer.c:107
#define GNUNET_free(ptr)
Wrapper around free.
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...
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...