GNUnet  0.20.0
messenger_api_list_tunnels.h File Reference

messenger api: client and service implementation of GNUnet MESSENGER service More...

#include "platform.h"
#include "gnunet_util_lib.h"
Include dependency graph for messenger_api_list_tunnels.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  GNUNET_MESSENGER_ListTunnel
 
struct  GNUNET_MESSENGER_ListTunnels
 

Functions

void init_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
 Initializes list of tunnels peer identities as empty list. More...
 
void clear_list_tunnels (struct GNUNET_MESSENGER_ListTunnels *tunnels)
 Clears the list of tunnels peer identities. More...
 
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. More...
 
struct GNUNET_MESSENGER_ListTunnelfind_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 and returns the matching element of the list. More...
 
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 GNUNET_YES on success, otherwise GNUNET_NO. More...
 
struct GNUNET_MESSENGER_ListTunnelremove_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 the list. More...
 
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. More...
 
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. More...
 

Detailed Description

messenger api: client and service implementation of GNUnet MESSENGER service

Author
Tobias Frisch

Definition in file messenger_api_list_tunnels.h.

Function Documentation

◆ init_list_tunnels()

void init_list_tunnels ( struct GNUNET_MESSENGER_ListTunnels tunnels)

Initializes list of tunnels peer identities as empty list.

Parameters
[out]tunnelsList of peer identities

Definition at line 30 of file messenger_api_list_tunnels.c.

31 {
32  GNUNET_assert(tunnels);
33 
34  tunnels->head = NULL;
35  tunnels->tail = NULL;
36 }
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_MESSENGER_ListTunnel * tail
struct GNUNET_MESSENGER_ListTunnel * head

References GNUNET_assert, GNUNET_MESSENGER_ListTunnels::head, and GNUNET_MESSENGER_ListTunnels::tail.

Referenced by create_room(), and create_srv_room().

Here is the caller graph for this function:

◆ clear_list_tunnels()

void clear_list_tunnels ( struct GNUNET_MESSENGER_ListTunnels tunnels)

Clears the list of tunnels peer identities.

Parameters
[in,out]tunnelsList of peer identities

Definition at line 39 of file messenger_api_list_tunnels.c.

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 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#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

References GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_PEER_change_rc(), GNUNET_MESSENGER_ListTunnels::head, GNUNET_MESSENGER_ListTunnel::peer, and GNUNET_MESSENGER_ListTunnels::tail.

Referenced by destroy_room(), and destroy_srv_room().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_to_list_tunnels()

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.

Parameters
[in,out]tunnelsList of peer identities
[in]peerPeer identity of tunnel

Definition at line 65 of file messenger_api_list_tunnels.c.

67 {
68  GNUNET_assert((tunnels) && (peer));
69 
71 
72  element->peer = GNUNET_PEER_intern (peer);
73 
75  tunnels->tail, element);
76 }
#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_new(type)
Allocate a struct or union of the given type.
GNUNET_PEER_Id GNUNET_PEER_intern(const struct GNUNET_PeerIdentity *pid)
Intern an peer identity.
Definition: peer.c:108
static int compare_list_tunnels(void *cls, struct GNUNET_MESSENGER_ListTunnel *element0, struct GNUNET_MESSENGER_ListTunnel *element1)
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.

References compare_list_tunnels(), GNUNET_assert, GNUNET_CONTAINER_DLL_insert_sorted, GNUNET_new, GNUNET_PEER_intern(), GNUNET_MESSENGER_ListTunnels::head, GNUNET_MESSENGER_ListTunnel::peer, peer, and GNUNET_MESSENGER_ListTunnels::tail.

Referenced by entry_handle_room_at(), handle_message_peer(), and load_list_tunnels().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_list_tunnels()

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 and returns the matching element of the list.

If no matching element is found, NULL gets returned.

If index is not NULL, index will be overridden with the numeric index of the found element in the list. If no matching element is found, index will contain the total amount of elements in the list.

Parameters
[in,out]tunnelsList of peer identities
[in]peerPeer identity of tunnel
[out]indexIndex of found element (optional)
Returns
Element in the list with matching peer identity

Definition at line 79 of file messenger_api_list_tunnels.c.

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 }
static struct GNUNET_PeerIdentity pid
Identity of the peer we transmit to / connect to.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
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
struct GNUNET_MESSENGER_ListTunnel * next
The identity of the host (wraps the signing key of the peer).

References GNUNET_assert, GNUNET_memcmp, GNUNET_PEER_resolve(), GNUNET_MESSENGER_ListTunnels::head, GNUNET_MESSENGER_ListTunnel::next, GNUNET_MESSENGER_ListTunnel::peer, peer, and pid.

Referenced by contains_list_tunnels(), handle_message_miss(), handle_miss_message(), and rebuild_srv_room_basement_structure().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ contains_list_tunnels()

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 GNUNET_YES on success, otherwise GNUNET_NO.

Parameters
[in,out]tunnelsList of peer identities
[in]peerPeer identity of tunnel
Returns
GNUNET_YES on success, otherwise GNUNET_NO

Definition at line 106 of file messenger_api_list_tunnels.c.

108 {
109  GNUNET_assert((tunnels) && (peer));
110 
111  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : GNUNET_NO;
112 }
@ GNUNET_YES
@ GNUNET_NO
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...

References find_list_tunnels(), GNUNET_assert, GNUNET_NO, GNUNET_YES, and peer.

Referenced by callback_room_disconnect(), handle_message_peer(), and recv_message_info().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_from_list_tunnels()

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 the list.

Parameters
[in,out]tunnelsList of peer identities
[in,out]elementElement of the list
Returns
Next element in the list

Definition at line 115 of file messenger_api_list_tunnels.c.

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 }

References GNUNET_assert, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_PEER_change_rc(), GNUNET_MESSENGER_ListTunnels::head, GNUNET_MESSENGER_ListTunnel::next, GNUNET_MESSENGER_ListTunnel::peer, and GNUNET_MESSENGER_ListTunnels::tail.

Referenced by handle_message_miss(), handle_miss_message(), and rebuild_srv_room_basement_structure().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_list_tunnels()

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.

Parameters
[out]tunnelsList of hashes
[in]pathPath of file

Definition at line 130 of file messenger_api_list_tunnels.c.

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 }
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...
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
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_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_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).
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.
Handle used to access files (and pipes).

References add_to_list_tunnels(), GNUNET_assert, GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_read(), GNUNET_DISK_file_seek(), GNUNET_DISK_file_test(), GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_DISK_SEEK_SET, GNUNET_YES, handle, len, and peer.

Referenced by load_srv_room().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ save_list_tunnels()

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.

Parameters
[in]tunnelsList of hashes
[in]pathPath of file

Definition at line 165 of file messenger_api_list_tunnels.c.

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 }
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
enum GNUNET_GenericReturnValue GNUNET_DISK_file_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition: disk.c:1427
@ GNUNET_DISK_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.

References GNUNET_assert, GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_seek(), GNUNET_DISK_file_sync(), GNUNET_DISK_file_write(), GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_WRITE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_DISK_SEEK_SET, GNUNET_PEER_resolve(), handle, GNUNET_MESSENGER_ListTunnels::head, GNUNET_MESSENGER_ListTunnel::next, GNUNET_MESSENGER_ListTunnel::peer, and pid.

Referenced by save_srv_room().

Here is the call graph for this function:
Here is the caller graph for this function: