GNUnet  0.11.x
Functions
messenger_api_list_tunnels.c File Reference

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

#include "messenger_api_list_tunnels.h"
Include dependency graph for messenger_api_list_tunnels.c:

Go to the source code of this file.

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...
 
static int compare_list_tunnels (void *cls, struct GNUNET_MESSENGER_ListTunnel *element0, struct GNUNET_MESSENGER_ListTunnel *element1)
 
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.c.

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 29 of file messenger_api_list_tunnels.c.

30 {
31  GNUNET_assert(tunnels);
32 
33  tunnels->head = NULL;
34  tunnels->tail = NULL;
35 }
#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().

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]tunnels List of peer identities

Definition at line 38 of file messenger_api_list_tunnels.c.

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 }
#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:197

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().

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

◆ compare_list_tunnels()

static int compare_list_tunnels ( void *  cls,
struct GNUNET_MESSENGER_ListTunnel element0,
struct GNUNET_MESSENGER_ListTunnel element1 
)
static

Definition at line 56 of file messenger_api_list_tunnels.c.

59 {
60  return ((int) element0->peer) - ((int) element1->peer);
61 }

References consensus-simulation::int, and GNUNET_MESSENGER_ListTunnel::peer.

Referenced by add_to_list_tunnels().

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]tunnels List of peer identities
[in]peerPeer identity of tunnel

Definition at line 64 of file messenger_api_list_tunnels.c.

66 {
67  GNUNET_assert((tunnels) && (peer));
68 
70 
71  element->peer = GNUNET_PEER_intern (peer);
72 
74  tunnels->tail, element);
75 }
#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:107
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]tunnels List 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 78 of file messenger_api_list_tunnels.c.

81 {
82  GNUNET_assert((tunnels) && (peer));
83 
84  struct GNUNET_MESSENGER_ListTunnel *element;
85  struct GNUNET_PeerIdentity pid;
86 
87  if (index)
88  *index = 0;
89 
90  for (element = tunnels->head; element; element = element->next)
91  {
92  GNUNET_PEER_resolve (element->peer, &pid);
93 
94  if (0 == GNUNET_memcmp(&pid, peer))
95  return element;
96 
97  if (index)
98  (*index) = (*index) + 1;
99  }
100 
101  return NULL;
102 }
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:225
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_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]tunnels List of peer identities
[in]peerPeer identity of tunnel
Returns
GNUNET_YES on success, otherwise GNUNET_NO

Definition at line 105 of file messenger_api_list_tunnels.c.

107 {
108  GNUNET_assert((tunnels) && (peer));
109 
110  return find_list_tunnels (tunnels, peer, NULL) != NULL ? GNUNET_YES : GNUNET_NO;
111 }
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
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]tunnels List of peer identities
[in/out]element Element of the list
Returns
Next element in the list

Definition at line 114 of file messenger_api_list_tunnels.c.

116 {
117  GNUNET_assert((tunnels) && (element));
118 
119  struct GNUNET_MESSENGER_ListTunnel *next = element->next;
120 
121  GNUNET_CONTAINER_DLL_remove(tunnels->head, tunnels->tail, element);
122  GNUNET_PEER_change_rc (element->peer, -1);
123  GNUNET_free(element);
124 
125  return next;
126 }

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_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]messagesList of hashes
[in]pathPath of file

Definition at line 129 of file messenger_api_list_tunnels.c.

131 {
132  GNUNET_assert((tunnels) && (path));
133 
134  if (GNUNET_YES != GNUNET_DISK_file_test (path))
135  return;
136 
138 
140  path, GNUNET_DISK_OPEN_READ, permission
141  );
142 
143  if (!handle)
144  return;
145 
147 
148  struct GNUNET_PeerIdentity peer;
149  ssize_t len;
150 
151  do {
152  len = GNUNET_DISK_file_read(handle, &peer, sizeof(peer));
153 
154  if (len != sizeof(peer))
155  break;
156 
157  add_to_list_tunnels(tunnels, &peer);
158  } while (len == sizeof(peer));
159 
161 }
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:1235
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:206
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:1306
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_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]messagesList of hashes
[in]pathPath of file

Definition at line 164 of file messenger_api_list_tunnels.c.

166 {
167  GNUNET_assert((tunnels) && (path));
168 
170 
173  );
174 
175  if (!handle)
176  return;
177 
179 
180  struct GNUNET_MESSENGER_ListTunnel *element;
181  struct GNUNET_PeerIdentity pid;
182 
183  for (element = tunnels->head; element; element = element->next)
184  {
185  GNUNET_PEER_resolve (element->peer, &pid);
186 
187  GNUNET_DISK_file_write(handle, &pid, sizeof(pid));
188  }
189 
192 }
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:1425
@ 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_room().

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