GNUnet  0.20.0
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  */
26 #include "platform.h"
28 
29 void
31 {
32  GNUNET_assert(tunnels);
33 
34  tunnels->head = NULL;
35  tunnels->tail = NULL;
36 }
37 
38 void
40 {
41  GNUNET_assert(tunnels);
42 
43  struct GNUNET_MESSENGER_ListTunnel *element;
44 
45  for (element = tunnels->head; element; element = tunnels->head)
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;
54 }
55 
56 static int
58  struct GNUNET_MESSENGER_ListTunnel *element0,
59  struct GNUNET_MESSENGER_ListTunnel *element1)
60 {
61  return ((int) element0->peer) - ((int) element1->peer);
62 }
63 
64 void
66  const struct GNUNET_PeerIdentity *peer)
67 {
68  GNUNET_assert((tunnels) && (peer));
69 
71 
72  element->peer = GNUNET_PEER_intern (peer);
73 
75  tunnels->tail, element);
76 }
77 
80  const struct GNUNET_PeerIdentity *peer,
81  size_t *index)
82 {
83  GNUNET_assert((tunnels) && (peer));
84 
85  struct GNUNET_MESSENGER_ListTunnel *element;
86  struct GNUNET_PeerIdentity pid;
87 
88  if (index)
89  *index = 0;
90 
91  for (element = tunnels->head; element; element = element->next)
92  {
93  GNUNET_PEER_resolve (element->peer, &pid);
94 
95  if (0 == GNUNET_memcmp(&pid, peer))
96  return element;
97 
98  if (index)
99  (*index) = (*index) + 1;
100  }
101 
102  return NULL;
103 }
104 
105 int
107  const struct GNUNET_PeerIdentity *peer)
108 {
109  GNUNET_assert((tunnels) && (peer));
110 
111  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : GNUNET_NO;
112 }
113 
116  struct GNUNET_MESSENGER_ListTunnel *element)
117 {
118  GNUNET_assert((tunnels) && (element));
119 
120  struct GNUNET_MESSENGER_ListTunnel *next = element->next;
121 
122  GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
123  GNUNET_PEER_change_rc (element->peer, -1);
124  GNUNET_free(element);
125 
126  return next;
127 }
128 
129 void
131  const char *path)
132 {
133  GNUNET_assert((tunnels) && (path));
134 
135  if (GNUNET_YES != GNUNET_DISK_file_test (path))
136  return;
137 
139 
141  path, GNUNET_DISK_OPEN_READ, permission
142  );
143 
144  if (!handle)
145  return;
146 
148 
149  struct GNUNET_PeerIdentity peer;
150  ssize_t len;
151 
152  do {
153  len = GNUNET_DISK_file_read(handle, &peer, sizeof(peer));
154 
155  if (len != sizeof(peer))
156  break;
157 
158  add_to_list_tunnels(tunnels, &peer);
159  } while (len == sizeof(peer));
160 
162 }
163 
164 void
166  const char *path)
167 {
168  GNUNET_assert((tunnels) && (path));
169 
171 
174  );
175 
176  if (!handle)
177  return;
178 
180 
181  struct GNUNET_MESSENGER_ListTunnel *element;
182  struct GNUNET_PeerIdentity pid;
183 
184  for (element = tunnels->head; element; element = element->next)
185  {
186  GNUNET_PEER_resolve (element->peer, &pid);
187 
188  GNUNET_DISK_file_write(handle, &pid, sizeof(pid));
189  }
190 
193 }
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
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_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.
@ GNUNET_YES
@ GNUNET_NO
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
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.
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)
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...
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 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.
void clear_list_tunnels(struct GNUNET_MESSENGER_ListTunnels *tunnels)
Clears the list of tunnels peer identities.
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...
messenger api: client and service implementation of GNUnet MESSENGER service
Handle used to access files (and pipes).
struct GNUNET_MESSENGER_ListTunnel * next
struct GNUNET_MESSENGER_ListTunnel * tail
struct GNUNET_MESSENGER_ListTunnel * head
The identity of the host (wraps the signing key of the peer).
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.