GNUnet  0.11.x
Data Structures | Macros | Functions
peerinfo_api.c File Reference

API to access peerinfo service. More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_protocols.h"
#include "peerinfo.h"
Include dependency graph for peerinfo_api.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_PEERINFO_IteratorContext
 Context for an iteration request. More...
 
struct  GNUNET_PEERINFO_Handle
 Handle to the peerinfo service. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "peerinfo-api", __VA_ARGS__)
 

Functions

static void reconnect (struct GNUNET_PEERINFO_Handle *h)
 Close the existing connection to PEERINFO and reconnect. More...
 
struct GNUNET_PEERINFO_HandleGNUNET_PEERINFO_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 Connect to the peerinfo service. More...
 
void GNUNET_PEERINFO_disconnect (struct GNUNET_PEERINFO_Handle *h)
 Disconnect from the peerinfo service. More...
 
static void reconnect_task (void *cls)
 Task scheduled to re-try connecting to the peerinfo service. More...
 
static void do_reconnect (struct GNUNET_PEERINFO_Handle *h)
 We encountered an error, reconnect to the PEERINFO service. More...
 
static void mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 We got a disconnect after asking regex to do the announcement. More...
 
static int check_info (void *cls, const struct InfoMessage *im)
 Function called when we receive an info message. More...
 
static void handle_info (void *cls, const struct InfoMessage *im)
 Handle info message. More...
 
static void send_ic_request (struct GNUNET_PEERINFO_Handle *h)
 Send the next IC request at the head of the queue. More...
 
static void handle_end_iteration (void *cls, const struct GNUNET_MessageHeader *msg)
 Type of a function to call when we receive a message from the service. More...
 
struct GNUNET_PEERINFO_IteratorContextGNUNET_PEERINFO_iterate (struct GNUNET_PEERINFO_Handle *h, int include_friend_only, const struct GNUNET_PeerIdentity *peer, GNUNET_PEERINFO_Processor callback, void *callback_cls)
 Call a method for each known matching host. More...
 
void GNUNET_PEERINFO_iterate_cancel (struct GNUNET_PEERINFO_IteratorContext *ic)
 Cancel an iteration over peer information. More...
 
struct GNUNET_MQ_EnvelopeGNUNET_PEERINFO_add_peer (struct GNUNET_PEERINFO_Handle *h, const struct GNUNET_HELLO_Message *hello, GNUNET_SCHEDULER_TaskCallback cont, void *cont_cls)
 Add a host to the persistent list. More...
 

Detailed Description

API to access peerinfo service.

Author
Christian Grothoff

Definition in file peerinfo_api.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "peerinfo-api", __VA_ARGS__)

Function Documentation

◆ reconnect()

static void reconnect ( struct GNUNET_PEERINFO_Handle h)
static

Close the existing connection to PEERINFO and reconnect.

Parameters
hhandle to the service

Definition at line 436 of file peerinfo_api.c.

References GNUNET_PEERINFO_Handle::cfg, GNUNET_CLIENT_connect(), GNUNET_MESSAGE_TYPE_PEERINFO_INFO, GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END, GNUNET_MQ_destroy(), GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_SCHEDULER_cancel(), GNUNET_PEERINFO_Handle::ic_head, GNUNET_PEERINFO_Handle::mq, mq_error_handler(), GNUNET_PEERINFO_Handle::r_task, and send_ic_request().

Referenced by GNUNET_PEERINFO_connect(), handle_end_iteration(), and reconnect_task().

437 {
439  GNUNET_MQ_hd_var_size (info,
441  struct InfoMessage,
442  h),
443  GNUNET_MQ_hd_fixed_size (end_iteration,
445  struct GNUNET_MessageHeader,
446  h),
448  };
449 
450  if (NULL != h->r_task)
451  {
453  h->r_task = NULL;
454  }
455  if (NULL != h->mq)
456  {
457  GNUNET_MQ_destroy (h->mq);
458  h->mq = NULL;
459  }
460  h->mq = GNUNET_CLIENT_connect (h->cfg,
461  "peerinfo",
462  handlers,
464  h);
465  if (NULL != h->ic_head)
466  send_ic_request (h);
467 }
struct GNUNET_MQ_Handle * mq
Connection to the service.
Definition: peerinfo_api.c:94
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1057
static void send_ic_request(struct GNUNET_PEERINFO_Handle *h)
Send the next IC request at the head of the queue.
Definition: peerinfo_api.c:351
Message used to inform the client about a particular peer; this message is optionally followed by a H...
Definition: peerinfo.h:102
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: peerinfo_api.c:89
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
static void mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
We got a disconnect after asking regex to do the announcement.
Definition: peerinfo_api.c:233
Message handler for a specific message type.
struct GNUNET_SCHEDULER_Task * r_task
ID for a reconnect task.
Definition: peerinfo_api.c:109
#define GNUNET_MESSAGE_TYPE_PEERINFO_INFO
Information about one of the peers.
Header for all communications.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
#define GNUNET_MESSAGE_TYPE_PEERINFO_INFO_END
End of information about other peers.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
Here is the call graph for this function:
Here is the caller graph for this function:

◆ reconnect_task()

static void reconnect_task ( void *  cls)
static

Task scheduled to re-try connecting to the peerinfo service.

Parameters
clsthe struct GNUNET_PEERINFO_Handle *

Definition at line 187 of file peerinfo_api.c.

References GNUNET_PEERINFO_IteratorContext::h, GNUNET_PEERINFO_Handle::r_task, and reconnect().

Referenced by do_reconnect().

188 {
189  struct GNUNET_PEERINFO_Handle *h = cls;
190 
191  h->r_task = NULL;
192  reconnect (h);
193 }
Handle to the peerinfo service.
Definition: peerinfo_api.c:84
static void reconnect(struct GNUNET_PEERINFO_Handle *h)
Close the existing connection to PEERINFO and reconnect.
Definition: peerinfo_api.c:436
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
struct GNUNET_SCHEDULER_Task * r_task
ID for a reconnect task.
Definition: peerinfo_api.c:109
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_reconnect()

static void do_reconnect ( struct GNUNET_PEERINFO_Handle h)
static

We encountered an error, reconnect to the PEERINFO service.

Parameters
hhandle to reconnect

Definition at line 202 of file peerinfo_api.c.

References _, GNUNET_PEERINFO_IteratorContext::callback, GNUNET_PEERINFO_IteratorContext::callback_cls, GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_add_now(), GNUNET_PEERINFO_Handle::ic_head, GNUNET_PEERINFO_Handle::ic_tail, GNUNET_PEERINFO_Handle::mq, GNUNET_PEERINFO_Handle::r_task, and reconnect_task().

Referenced by mq_error_handler().

203 {
205 
206  GNUNET_MQ_destroy (h->mq);
207  h->mq = NULL;
208  if (NULL != ic)
209  {
211  h->ic_tail,
212  ic);
213  if (NULL != ic->callback)
214  ic->callback (ic->callback_cls,
215  NULL,
216  NULL,
217  _ ("Failed to receive response from `PEERINFO' service."));
218  GNUNET_free (ic);
219  }
221  h);
222 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_MQ_Handle * mq
Connection to the service.
Definition: peerinfo_api.c:94
struct GNUNET_PEERINFO_IteratorContext * ic_tail
Tail of iterator DLL.
Definition: peerinfo_api.c:104
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
Context for an iteration request.
Definition: peerinfo_api.c:37
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1280
void * callback_cls
Closure for callback.
Definition: peerinfo_api.c:62
static void reconnect_task(void *cls)
Task scheduled to re-try connecting to the peerinfo service.
Definition: peerinfo_api.c:187
struct GNUNET_SCHEDULER_Task * r_task
ID for a reconnect task.
Definition: peerinfo_api.c:109
GNUNET_PEERINFO_Processor callback
Function to call with the results.
Definition: peerinfo_api.c:57
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mq_error_handler()

static void mq_error_handler ( void *  cls,
enum GNUNET_MQ_Error  error 
)
static

We got a disconnect after asking regex to do the announcement.

Retry.

Parameters
clsthe struct GNUNET_PEERINFO_Handle to retry
errorerror code

Definition at line 233 of file peerinfo_api.c.

References do_reconnect(), and GNUNET_PEERINFO_IteratorContext::h.

Referenced by reconnect().

235 {
236  struct GNUNET_PEERINFO_Handle *h = cls;
237 
238  do_reconnect (h);
239 }
Handle to the peerinfo service.
Definition: peerinfo_api.c:84
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
static void do_reconnect(struct GNUNET_PEERINFO_Handle *h)
We encountered an error, reconnect to the PEERINFO service.
Definition: peerinfo_api.c:202
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_info()

static int check_info ( void *  cls,
const struct InfoMessage im 
)
static

Function called when we receive an info message.

Check it is well-formed.

Parameters
clsclosure
immessage received
Returns
GNUNET_OK if the message is OK

Definition at line 251 of file peerinfo_api.c.

References GNUNET_break, GNUNET_ERROR_TYPE_ERROR, GNUNET_HELLO_get_id(), GNUNET_HELLO_size(), GNUNET_i2s(), GNUNET_memcmp, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_PEERINFO_IteratorContext::h, GNUNET_PEERINFO_IteratorContext::have_peer, InfoMessage::header, GNUNET_PEERINFO_Handle::ic_head, LOG, GNUNET_PEERINFO_IteratorContext::peer, InfoMessage::peer, InfoMessage::reserved, and GNUNET_MessageHeader::size.

253 {
254  struct GNUNET_PEERINFO_Handle *h = cls;
256  uint16_t ms = ntohs (im->header.size) - sizeof(*im);
257 
258  if (0 != ntohl (im->reserved))
259  {
260  GNUNET_break (0);
261  return GNUNET_SYSERR;
262  }
263  if (NULL == ic)
264  {
265  /* didn't expect a response, bad */
266  GNUNET_break (0);
267  return GNUNET_SYSERR;
268  }
269  if ((GNUNET_YES == ic->have_peer) &&
270  (0 != GNUNET_memcmp (&ic->peer,
271  &im->peer)))
272  {
273  /* bogus message (from a different iteration call?); out of sequence! */
275  "Received HELLO for peer `%s', expected peer `%s'\n",
276  GNUNET_i2s (&im->peer),
277  GNUNET_i2s (&ic->peer));
278  GNUNET_break (0);
279  return GNUNET_SYSERR;
280  }
281  if (ms > sizeof(struct GNUNET_MessageHeader))
282  {
283  const struct GNUNET_HELLO_Message *hello;
284  struct GNUNET_PeerIdentity id;
285 
286  hello = (const struct GNUNET_HELLO_Message *) &im[1];
287  if (ms != GNUNET_HELLO_size (hello))
288  {
289  /* malformed message */
290  GNUNET_break (0);
291  return GNUNET_SYSERR;
292  }
293  if (GNUNET_OK !=
294  GNUNET_HELLO_get_id (hello,
295  &id))
296  {
297  /* malformed message */
298  GNUNET_break (0);
299  return GNUNET_SYSERR;
300  }
301  if (0 != GNUNET_memcmp (&im->peer,
302  &id))
303  {
304  /* malformed message */
305  GNUNET_break (0);
306  return GNUNET_SYSERR;
307  }
308  }
309  else if (0 != ms)
310  {
311  /* malformed message */
312  GNUNET_break (0);
313  return GNUNET_SYSERR;
314  }
315  return GNUNET_OK;
316 }
int GNUNET_HELLO_get_id(const struct GNUNET_HELLO_Message *hello, struct GNUNET_PeerIdentity *peer)
Get the peer identity from a HELLO message.
Definition: hello.c:671
Handle to the peerinfo service.
Definition: peerinfo_api.c:84
A HELLO message is used to exchange information about transports with other peers.
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define LOG(kind,...)
Definition: peerinfo_api.c:31
Context for an iteration request.
Definition: peerinfo_api.c:37
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
struct GNUNET_PeerIdentity peer
About which peer are we talking here?
Definition: peerinfo.h:117
uint32_t reserved
Always zero.
Definition: peerinfo.h:112
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_PEERINFO_INFO.
Definition: peerinfo.h:107
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
#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).
uint16_t GNUNET_HELLO_size(const struct GNUNET_HELLO_Message *hello)
Return the size of the given HELLO message.
Definition: hello.c:652
Header for all communications.
struct GNUNET_PeerIdentity peer
Peer we are interested in (only valid if iteration was restricted to one peer).
Definition: peerinfo_api.c:67
#define GNUNET_YES
Definition: gnunet_common.h:77
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:

◆ handle_info()

static void handle_info ( void *  cls,
const struct InfoMessage im 
)
static

Handle info message.

Parameters
clsclosure
immessage received

Definition at line 326 of file peerinfo_api.c.

References GNUNET_PEERINFO_IteratorContext::callback, GNUNET_PEERINFO_IteratorContext::callback_cls, GNUNET_PEERINFO_IteratorContext::h, InfoMessage::header, GNUNET_PEERINFO_Handle::ic_head, InfoMessage::peer, and GNUNET_MessageHeader::size.

328 {
329  struct GNUNET_PEERINFO_Handle *h = cls;
331  const struct GNUNET_HELLO_Message *hello = NULL;
332  uint16_t ms;
333 
334  ms = ntohs (im->header.size);
335  if (ms > sizeof(struct InfoMessage))
336  hello = (const struct GNUNET_HELLO_Message *) &im[1];
337  if (NULL != ic->callback)
338  ic->callback (ic->callback_cls,
339  &im->peer,
340  hello,
341  NULL);
342 }
Handle to the peerinfo service.
Definition: peerinfo_api.c:84
A HELLO message is used to exchange information about transports with other peers.
Message used to inform the client about a particular peer; this message is optionally followed by a H...
Definition: peerinfo.h:102
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
Context for an iteration request.
Definition: peerinfo_api.c:37
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
struct GNUNET_PeerIdentity peer
About which peer are we talking here?
Definition: peerinfo.h:117
void * callback_cls
Closure for callback.
Definition: peerinfo_api.c:62
struct GNUNET_MessageHeader header
Type will be GNUNET_MESSAGE_TYPE_PEERINFO_INFO.
Definition: peerinfo.h:107
GNUNET_PEERINFO_Processor callback
Function to call with the results.
Definition: peerinfo_api.c:57

◆ send_ic_request()

static void send_ic_request ( struct GNUNET_PEERINFO_Handle h)
static

Send the next IC request at the head of the queue.

Parameters
hhandle

Definition at line 351 of file peerinfo_api.c.

References env, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_MESSAGE_TYPE_PEERINFO_GET, GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_PEERINFO_IteratorContext::have_peer, GNUNET_PEERINFO_Handle::ic_head, ListPeerMessage::include_friend_only, ListAllPeersMessage::include_friend_only, GNUNET_PEERINFO_IteratorContext::include_friend_only, LOG, GNUNET_PEERINFO_Handle::mq, ListPeerMessage::peer, and GNUNET_PEERINFO_IteratorContext::peer.

Referenced by GNUNET_PEERINFO_iterate(), handle_end_iteration(), and reconnect().

352 {
354  struct GNUNET_MQ_Envelope *env;
355  struct ListAllPeersMessage *lapm;
356  struct ListPeerMessage *lpm;
357 
358  if (NULL == ic)
359  {
360  GNUNET_break (0);
361  return;
362  }
363  if (NULL == h->mq)
364  {
365  GNUNET_break (0);
366  return;
367  }
368  if (GNUNET_NO == ic->have_peer)
369  {
371  "Requesting list of peers from PEERINFO service\n");
372  env = GNUNET_MQ_msg (lapm,
374  lapm->include_friend_only = htonl (ic->include_friend_only);
375  }
376  else
377  {
379  "Requesting information on peer `%s' from PEERINFO service\n",
380  GNUNET_i2s (&ic->peer));
381  env = GNUNET_MQ_msg (lpm,
383  lpm->include_friend_only = htonl (ic->include_friend_only);
384  lpm->peer = ic->peer;
385  }
386  GNUNET_MQ_send (h->mq,
387  env);
388 }
uint32_t include_friend_only
Include friend only HELLOs and peers in callbacks.
Definition: peerinfo.h:74
#define GNUNET_MESSAGE_TYPE_PEERINFO_GET
Request update and listing of a peer.
struct GNUNET_MQ_Handle * mq
Connection to the service.
Definition: peerinfo_api.c:94
uint32_t include_friend_only
Include friend only HELLOs and peers in callbacks.
Definition: peerinfo.h:51
struct GNUNET_PeerIdentity peer
Restrict to peers with this identity (optional field, check header.size!).
Definition: peerinfo.h:57
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_NO
Definition: gnunet_common.h:78
#define LOG(kind,...)
Definition: peerinfo_api.c:31
Context for an iteration request.
Definition: peerinfo_api.c:37
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
Message requesting a listing of all peers, restricted to the specified peer identity.
Definition: peerinfo.h:64
int include_friend_only
Only include friends in reply?
Definition: peerinfo_api.c:77
Message requesting a listing of peers, restricted to the specified peer identity. ...
Definition: peerinfo.h:41
#define GNUNET_MESSAGE_TYPE_PEERINFO_GET_ALL
Request update and listing of all peers.
struct GNUNET_PeerIdentity peer
Peer we are interested in (only valid if iteration was restricted to one peer).
Definition: peerinfo_api.c:67
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_end_iteration()

static void handle_end_iteration ( void *  cls,
const struct GNUNET_MessageHeader msg 
)
static

Type of a function to call when we receive a message from the service.

Call the iterator with the result and (if applicable) continue to receive more messages or trigger processing the next event (if applicable).

Parameters
clsclosure
msgmessage received, NULL on timeout or fatal error

Definition at line 401 of file peerinfo_api.c.

References GNUNET_PEERINFO_IteratorContext::callback, GNUNET_PEERINFO_IteratorContext::callback_cls, GNUNET_break, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_PEERINFO_IteratorContext::h, GNUNET_PEERINFO_Handle::ic_head, GNUNET_PEERINFO_Handle::ic_tail, LOG, reconnect(), and send_ic_request().

403 {
404  struct GNUNET_PEERINFO_Handle *h = cls;
406 
407  if (NULL == ic)
408  {
409  /* didn't expect a response, reconnect */
410  GNUNET_break (0);
411  reconnect (h);
412  return;
413  }
415  "Received end of list of peers from PEERINFO service\n");
417  h->ic_tail,
418  ic);
419  if (NULL != h->ic_head)
420  send_ic_request (h);
421  if (NULL != ic->callback)
422  ic->callback (ic->callback_cls,
423  NULL,
424  NULL,
425  NULL);
426  GNUNET_free (ic);
427 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Handle to the peerinfo service.
Definition: peerinfo_api.c:84
static void reconnect(struct GNUNET_PEERINFO_Handle *h)
Close the existing connection to PEERINFO and reconnect.
Definition: peerinfo_api.c:436
static void send_ic_request(struct GNUNET_PEERINFO_Handle *h)
Send the next IC request at the head of the queue.
Definition: peerinfo_api.c:351
struct GNUNET_PEERINFO_IteratorContext * ic_tail
Tail of iterator DLL.
Definition: peerinfo_api.c:104
struct GNUNET_PEERINFO_IteratorContext * ic_head
Head of iterator DLL.
Definition: peerinfo_api.c:99
#define LOG(kind,...)
Definition: peerinfo_api.c:31
Context for an iteration request.
Definition: peerinfo_api.c:37
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
void * callback_cls
Closure for callback.
Definition: peerinfo_api.c:62
GNUNET_PEERINFO_Processor callback
Function to call with the results.
Definition: peerinfo_api.c:57
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function: