GNUnet  0.11.x
Data Structures | Macros | Functions | Variables
plugin_rest_peerinfo.c File Reference
#include "platform.h"
#include "gnunet_rest_plugin.h"
#include "gnunet_peerinfo_service.h"
#include "gnunet_transport_service.h"
#include "gnunet_rest_lib.h"
#include "gnunet_json_lib.h"
#include "microhttpd.h"
#include <jansson.h>
Include dependency graph for plugin_rest_peerinfo.c:

Go to the source code of this file.

Data Structures

struct  Plugin
 Handle for a plugin. More...
 
struct  AddressRecord
 Record we keep for each printable address. More...
 
struct  PrintContext
 Structure we use to collect printable address information. More...
 
struct  RequestHandle
 The request handle. More...
 

Macros

#define GNUNET_REST_API_NS_PEERINFO   "/peerinfo"
 Peerinfo Namespace. More...
 
#define GNUNET_REST_PEERINFO_PEER   "peer"
 Peerinfo parameter peer. More...
 
#define GNUNET_REST_PEERINFO_FRIEND   "friend"
 Peerinfo parameter friend. More...
 
#define GNUNET_REST_PEERINFO_ARRAY   "array"
 Peerinfo parameter array. More...
 
#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN   "Unknown Error"
 Error message Unknown Error. More...
 
#define TIMEOUT   GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
 How long until we time out during address lookup? More...
 

Functions

static void cleanup_handle (void *cls)
 Cleanup lookup handle. More...
 
static void do_error (void *cls)
 Task run on errors. More...
 
static void peerinfo_list_finished (void *cls)
 Function that assembles the response. More...
 
static int count_address (void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
 Iterator callback to go over all addresses and count them. More...
 
static void dump_pc (struct PrintContext *pc)
 Print the collected address information to the console and free pc. More...
 
static void process_resolved_address (void *cls, const char *address, int res)
 Function to call with a human-readable format of an address. More...
 
static int print_address (void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
 Iterator callback to go over all addresses. More...
 
void peerinfo_list_iteration (void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Message *hello, const char *err_msg)
 Callback that processes each of the known HELLOs for the iteration response construction. More...
 
void peerinfo_get (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Handle peerinfo GET request. More...
 
static void options_cont (struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
 Respond to OPTIONS request. More...
 
static void init_cont (struct RequestHandle *handle)
 Handle rest request. More...
 
static void rest_process_request (struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
 Function processing the REST call. More...
 
void * libgnunet_plugin_rest_peerinfo_init (void *cls)
 Entry point for the plugin. More...
 
void * libgnunet_plugin_rest_peerinfo_done (void *cls)
 Exit point from the plugin. More...
 

Variables

const struct GNUNET_CONFIGURATION_Handlecfg
 The configuration handle. More...
 
static char * allow_methods
 HTTP methods allows for this plugin. More...
 
static struct PrintContextpc_head
 Head of list of print contexts. More...
 
static struct PrintContextpc_tail
 Tail of list of print contexts. More...
 

Macro Definition Documentation

◆ GNUNET_REST_API_NS_PEERINFO

#define GNUNET_REST_API_NS_PEERINFO   "/peerinfo"

Peerinfo Namespace.

Definition at line 39 of file plugin_rest_peerinfo.c.

Referenced by init_cont(), and libgnunet_plugin_rest_peerinfo_init().

◆ GNUNET_REST_PEERINFO_PEER

#define GNUNET_REST_PEERINFO_PEER   "peer"

Peerinfo parameter peer.

Definition at line 44 of file plugin_rest_peerinfo.c.

Referenced by dump_pc(), and peerinfo_get().

◆ GNUNET_REST_PEERINFO_FRIEND

#define GNUNET_REST_PEERINFO_FRIEND   "friend"

Peerinfo parameter friend.

Definition at line 49 of file plugin_rest_peerinfo.c.

Referenced by peerinfo_get().

◆ GNUNET_REST_PEERINFO_ARRAY

#define GNUNET_REST_PEERINFO_ARRAY   "array"

Peerinfo parameter array.

Definition at line 54 of file plugin_rest_peerinfo.c.

Referenced by dump_pc().

◆ GNUNET_REST_PEERINFO_ERROR_UNKNOWN

#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN   "Unknown Error"

Error message Unknown Error.

Definition at line 59 of file plugin_rest_peerinfo.c.

Referenced by do_error().

◆ TIMEOUT

How long until we time out during address lookup?

Definition at line 64 of file plugin_rest_peerinfo.c.

Referenced by print_address().

Function Documentation

◆ cleanup_handle()

static void cleanup_handle ( void *  cls)
static

Cleanup lookup handle.

Parameters
handleHandle to clean up

Definition at line 259 of file plugin_rest_peerinfo.c.

References RequestHandle::address, RequestHandle::emsg, RequestHandle::expiration_str, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_PEERINFO_disconnect(), GNUNET_PEERINFO_iterate_cancel(), GNUNET_SCHEDULER_cancel(), handle, RequestHandle::list_it, RequestHandle::peerinfo_handle, RequestHandle::pubkey, RequestHandle::response, RequestHandle::temp_array, RequestHandle::timeout_task, and RequestHandle::url.

Referenced by do_error(), options_cont(), and peerinfo_list_finished().

260 {
261  struct RequestHandle *handle = cls;
262 
264  "Cleaning up\n");
265  if (NULL != handle->timeout_task)
266  {
268  handle->timeout_task = NULL;
269  }
270  if (NULL != handle->url)
271  GNUNET_free (handle->url);
272  if (NULL != handle->emsg)
273  GNUNET_free (handle->emsg);
274  if (NULL != handle->address)
275  GNUNET_free ((char*) handle->address);
276  if (NULL != handle->expiration_str)
277  GNUNET_free (handle->expiration_str);
278  if (NULL != handle->pubkey)
279  GNUNET_free (handle->pubkey);
280 
281  if (NULL != handle->temp_array)
282  {
283  json_decref (handle->temp_array);
284  handle->temp_array = NULL;
285  }
286  if (NULL != handle->response)
287  {
288  json_decref (handle->response);
289  handle->response = NULL;
290  }
291 
292  if (NULL != handle->list_it)
293  {
295  handle->list_it = NULL;
296  }
297  if (NULL != handle->peerinfo_handle)
298  {
300  handle->peerinfo_handle = NULL;
301  }
302 
303  GNUNET_free (handle);
304 }
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
void GNUNET_PEERINFO_iterate_cancel(struct GNUNET_PEERINFO_IteratorContext *ic)
Cancel an iteration over peer information.
Definition: peerinfo_api.c:520
char * emsg
Error response message.
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
json_t * response
JSON response.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
char * expiration_str
Expiration time string.
json_t * temp_array
JSON temporary array.
#define GNUNET_log(kind,...)
void GNUNET_PEERINFO_disconnect(struct GNUNET_PEERINFO_Handle *h)
Disconnect from the peerinfo service.
Definition: peerinfo_api.c:156
const char * address
Address string.
char * pubkey
Iteration peer public key.
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:966
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_error()

static void do_error ( void *  cls)
static

Task run on errors.

Reports an error and cleans up everything.

Parameters
clsthe struct RequestHandle

Definition at line 313 of file plugin_rest_peerinfo.c.

References cleanup_handle(), RequestHandle::emsg, GNUNET_free, GNUNET_REST_create_response(), GNUNET_REST_PEERINFO_ERROR_UNKNOWN, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::proc, RequestHandle::proc_cls, response, and RequestHandle::response_code.

Referenced by init_cont(), peerinfo_list_finished(), peerinfo_list_iteration(), and rest_process_request().

314 {
315  struct RequestHandle *handle = cls;
316  struct MHD_Response *resp;
317  json_t *json_error = json_object ();
318  char *response;
319 
320  if (NULL == handle->emsg)
322 
323  json_object_set_new (json_error, "error", json_string (handle->emsg));
324 
325  if (0 == handle->response_code)
326  handle->response_code = MHD_HTTP_OK;
327  response = json_dumps (json_error, 0);
328  resp = GNUNET_REST_create_response (response);
329  handle->proc (handle->proc_cls, resp, handle->response_code);
330  json_decref (json_error);
331  GNUNET_free (response);
333 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
#define GNUNET_REST_PEERINFO_ERROR_UNKNOWN
Error message Unknown Error.
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
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
Response code.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
static struct MHD_Response * response
Our canonical response.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_list_finished()

static void peerinfo_list_finished ( void *  cls)
static

Function that assembles the response.

Parameters
clsthe struct RequestHandle

Definition at line 342 of file plugin_rest_peerinfo.c.

References cleanup_handle(), do_error(), RequestHandle::emsg, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free_non_null, GNUNET_log, GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, RequestHandle::proc, RequestHandle::proc_cls, RequestHandle::response, and RequestHandle::response_code.

Referenced by dump_pc().

343 {
344  struct RequestHandle *handle = cls;
345  char *result_str;
346  struct MHD_Response *resp;
347 
348  if (NULL == handle->response)
349  {
350  handle->response_code = MHD_HTTP_NOT_FOUND;
351  handle->emsg = GNUNET_strdup ("No peers found");
353  return;
354  }
355 
356  result_str = json_dumps (handle->response, 0);
357  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
358  resp = GNUNET_REST_create_response (result_str);
359  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
360  GNUNET_free_non_null (result_str);
362 }
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
char * emsg
Error response message.
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
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
Response code.
json_t * response
JSON response.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
#define GNUNET_log(kind,...)
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ count_address()

static int count_address ( void *  cls,
const struct GNUNET_HELLO_Address address,
struct GNUNET_TIME_Absolute  expiration 
)
static

Iterator callback to go over all addresses and count them.

Parameters
clsstruct PrintContext * with off to increment
addressthe address
expirationexpiration time
Returns
GNUNET_OK to keep the address and continue

Definition at line 374 of file plugin_rest_peerinfo.c.

References GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), PrintContext::off, and pc.

Referenced by peerinfo_list_iteration().

377 {
378  struct PrintContext *pc = cls;
379 
380  if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
381  {
382  return GNUNET_OK; /* ignore expired address */
383  }
384 
385  pc->off++;
386  return GNUNET_OK;
387 }
Structure we use to collect printable address information.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
unsigned int off
Current offset in address_list (counted down).
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dump_pc()

static void dump_pc ( struct PrintContext pc)
static

Print the collected address information to the console and free pc.

Parameters
pcprinting context

Definition at line 396 of file plugin_rest_peerinfo.c.

References address, PrintContext::address_list, AddressRecord::expiration, PrintContext::friend_only, GNUNET_asprintf(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_free_non_null, GNUNET_i2s_full(), GNUNET_REST_PEERINFO_ARRAY, GNUNET_REST_PEERINFO_PEER, GNUNET_SCHEDULER_add_now(), GNUNET_STRINGS_absolute_time_to_string(), GNUNET_YES, handle, PrintContext::handle, RequestHandle::list_it, PrintContext::num_addresses, PrintContext::peer, peerinfo_list_finished(), RequestHandle::response, AddressRecord::result, and RequestHandle::temp_array.

Referenced by peerinfo_list_iteration(), and process_resolved_address().

397 {
398  struct RequestHandle *handle;
399  unsigned int i;
400  json_t *response_entry;
401  json_t *temp_array;
402  json_t *object;
403  json_t *address;
404  json_t *expires;
405  json_t *friend_and_peer_json;
406  char *friend_and_peer;
407 
408  temp_array = json_array ();
409  response_entry = json_object ();
410 
411  for (i = 0; i < pc->num_addresses; i++)
412  {
413  if (NULL != pc->address_list[i].result)
414  {
415  object = json_object ();
416  address = json_string (pc->address_list[i].result);
417  expires = json_string (
419  pc->address_list[i].expiration));
420  json_object_set (object, "address", address);
421  json_object_set (object, "expires", expires);
422 
423  json_decref (address);
424  json_decref (expires);
425 
426  json_array_append (temp_array, object);
427  json_decref (object);
429  }
430  }
431 
432  if (0 < json_array_size (temp_array))
433  {
434  GNUNET_asprintf (&friend_and_peer,
435  "%s%s",
436  (GNUNET_YES == pc->friend_only) ? "F2F:" : "",
437  GNUNET_i2s_full (&pc->peer));
438  friend_and_peer_json = json_string (friend_and_peer);
439  json_object_set (response_entry,
441  friend_and_peer_json);
442  json_object_set (response_entry,
444  temp_array);
445  json_array_append (pc->handle->response, response_entry);
446  json_decref (friend_and_peer_json);
447  GNUNET_free (friend_and_peer);
448  }
449 
450  json_decref (temp_array);
451  json_decref (response_entry);
452 
455  pc_tail,
456  pc);
457  handle = pc->handle;
458  GNUNET_free (pc);
459 
460  if ((NULL == pc_head) &&
461  (NULL == handle->list_it))
462  {
464  }
465 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_PeerIdentity peer
Identity of the peer.
const char * GNUNET_i2s_full(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
The request handle.
unsigned int num_addresses
Number of completed addresses in address_list.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
static void peerinfo_list_finished(void *cls)
Function that assembles the response.
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
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_TIME_Absolute expiration
Address expiration time.
#define GNUNET_REST_PEERINFO_ARRAY
Peerinfo parameter array.
json_t * response
JSON response.
#define GNUNET_REST_PEERINFO_PEER
Peerinfo parameter peer.
char * result
Printable address.
static struct PrintContext * pc_head
Head of list of print contexts.
json_t * temp_array
JSON temporary array.
#define GNUNET_YES
Definition: gnunet_common.h:77
int friend_only
Hello was friend only, GNUNET_YES or GNUNET_NO.
struct AddressRecord * address_list
List of printable addresses.
const char * GNUNET_STRINGS_absolute_time_to_string(struct GNUNET_TIME_Absolute t)
Like asctime, except for GNUnet time.
Definition: strings.c:742
static char * address
GNS address for this phone.
struct RequestHandle * handle
RequestHandle.
static struct PrintContext * pc_tail
Tail of list of print contexts.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ process_resolved_address()

static void process_resolved_address ( void *  cls,
const char *  address,
int  res 
)
static

Function to call with a human-readable format of an address.

Parameters
clsclosure
addressNULL on error, otherwise 0-terminated printable UTF-8 string
resresult of the address to string conversion: if GNUNET_OK: address was valid (conversion to string might still have failed) if GNUNET_SYSERR: address is invalid

Definition at line 479 of file plugin_rest_peerinfo.c.

References _, PrintContext::address_list_size, AddressRecord::atsc, dump_pc(), GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_i2s(), GNUNET_log, GNUNET_strdup, GNUNET_SYSERR, PrintContext::num_addresses, pc, AddressRecord::pc, PrintContext::peer, and AddressRecord::result.

Referenced by print_address().

482 {
483  struct AddressRecord *ar = cls;
484  struct PrintContext *pc = ar->pc;
485 
486  if (NULL != address)
487  {
488  if (0 != strlen (address))
489  {
490  if (NULL != ar->result)
491  GNUNET_free (ar->result);
492  ar->result = GNUNET_strdup (address);
493  }
494  return;
495  }
496  ar->atsc = NULL;
497  if (GNUNET_SYSERR == res)
499  _ ("Failure: Cannot convert address to string for peer `%s'\n"),
500  GNUNET_i2s (&ar->pc->peer));
501  pc->num_addresses++;
502  if (pc->num_addresses == pc->address_list_size)
503  dump_pc (ar->pc);
504 }
struct GNUNET_PeerIdentity peer
Identity of the peer.
struct PrintContext * pc
Print context this address record belongs to.
Structure we use to collect printable address information.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
unsigned int num_addresses
Number of completed addresses in address_list.
Record we keep for each printable address.
static int res
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
struct GNUNET_TRANSPORT_AddressToStringContext * atsc
Current address-to-string context (if active, otherwise NULL).
char * result
Printable address.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
#define GNUNET_log(kind,...)
static void dump_pc(struct PrintContext *pc)
Print the collected address information to the console and free pc.
unsigned int address_list_size
Number of addresses allocated in address_list.
static char * address
GNS address for this phone.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ print_address()

static int print_address ( void *  cls,
const struct GNUNET_HELLO_Address address,
struct GNUNET_TIME_Absolute  expiration 
)
static

Iterator callback to go over all addresses.

Parameters
clsclosure
addressthe address
expirationexpiration time
Returns
GNUNET_OK to keep the address and continue

Definition at line 516 of file plugin_rest_peerinfo.c.

References GNUNET_HELLO_Address::address_length, PrintContext::address_list, AddressRecord::atsc, AddressRecord::expiration, expiration, GNUNET_asprintf(), GNUNET_assert, GNUNET_NO, GNUNET_OK, GNUNET_TIME_absolute_get_remaining(), GNUNET_TRANSPORT_address_to_string(), GNUNET_HELLO_Address::local_info, PrintContext::off, pc, AddressRecord::pc, process_resolved_address(), AddressRecord::result, TIMEOUT, and GNUNET_HELLO_Address::transport_name.

Referenced by peerinfo_list_iteration().

519 {
520  struct PrintContext *pc = cls;
521  struct AddressRecord *ar;
522 
523  if (0 == GNUNET_TIME_absolute_get_remaining (expiration).rel_value_us)
524  {
525  return GNUNET_OK; /* ignore expired address */
526  }
527 
528  GNUNET_assert (0 < pc->off);
529  ar = &pc->address_list[--pc->off];
530  ar->pc = pc;
531  ar->expiration = expiration;
532  GNUNET_asprintf (&ar->result,
533  "%s:%u:%u",
534  address->transport_name,
535  address->address_length,
536  address->local_info);
538  address,
539  GNUNET_NO,
540  TIMEOUT,
542  ar);
543  return GNUNET_OK;
544 }
size_t address_length
Number of bytes in address.
enum GNUNET_HELLO_AddressInfo local_info
Extended information about address.
struct PrintContext * pc
Print context this address record belongs to.
Structure we use to collect printable address information.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
Record we keep for each printable address.
const char * transport_name
Name of the transport plugin enabling the communication using this address.
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
struct GNUNET_TIME_Absolute expiration
Address expiration time.
static void process_resolved_address(void *cls, const char *address, int res)
Function to call with a human-readable format of an address.
struct GNUNET_TRANSPORT_AddressToStringContext * GNUNET_TRANSPORT_address_to_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HELLO_Address *address, int numeric, struct GNUNET_TIME_Relative timeout, GNUNET_TRANSPORT_AddressToStringCallback aluc, void *aluc_cls)
Convert a binary address into a human readable address.
struct GNUNET_TRANSPORT_AddressToStringContext * atsc
Current address-to-string context (if active, otherwise NULL).
char * result
Printable address.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
unsigned int off
Current offset in address_list (counted down).
#define TIMEOUT
How long until we time out during address lookup?
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:331
struct AddressRecord * address_list
List of printable addresses.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_list_iteration()

void peerinfo_list_iteration ( void *  cls,
const struct GNUNET_PeerIdentity peer,
const struct GNUNET_HELLO_Message hello,
const char *  err_msg 
)

Callback that processes each of the known HELLOs for the iteration response construction.

Parameters
clsclosure, NULL
peerid of the peer, NULL for last call
hellohello message for the peer (can be NULL)
err_msgmessage

Definition at line 557 of file plugin_rest_peerinfo.c.

References PrintContext::address_list, PrintContext::address_list_size, count_address(), do_error(), dump_pc(), RequestHandle::emsg, PrintContext::friend_only, GNUNET_CONTAINER_DLL_insert, GNUNET_free, GNUNET_HELLO_is_friend_only(), GNUNET_HELLO_iterate_addresses(), GNUNET_malloc, GNUNET_new, GNUNET_NO, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, handle, PrintContext::handle, RequestHandle::list_it, PrintContext::off, pc, PrintContext::peer, peer, print_address(), RequestHandle::response, and RequestHandle::response_code.

Referenced by peerinfo_get().

561 {
562  struct RequestHandle *handle = cls;
563  struct PrintContext *pc;
564  int friend_only;
565 
566  if (NULL == handle->response)
567  {
568  handle->response = json_array ();
569  }
570 
571  if (NULL == peer)
572  {
573  handle->list_it = NULL;
574  handle->emsg = GNUNET_strdup ("Error in communication with peerinfo");
575  if (NULL != err_msg)
576  {
577  GNUNET_free (handle->emsg);
578  handle->emsg = GNUNET_strdup (err_msg);
579  handle->response_code = MHD_HTTP_INTERNAL_SERVER_ERROR;
580  }
581  if (NULL == pc_head)
583  return;
584  }
585  if (NULL == hello)
586  return;
587 
588  friend_only = GNUNET_NO;
589  if (NULL != hello)
590  friend_only = GNUNET_HELLO_is_friend_only (hello);
591 
592  pc = GNUNET_new (struct PrintContext);
594  pc_tail,
595  pc);
596  pc->peer = *peer;
597  pc->friend_only = friend_only;
598  pc->handle = handle;
600  GNUNET_NO,
601  &count_address,
602  pc);
603  if (0 == pc->off)
604  {
605  dump_pc (pc);
606  return;
607  }
608  pc->address_list_size = pc->off;
610  sizeof(struct AddressRecord) * pc->off);
612  GNUNET_NO,
613  &print_address,
614  pc);
615 }
struct GNUNET_PeerIdentity peer
Identity of the peer.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
Structure we use to collect printable address information.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
The request handle.
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
Record we keep for each printable address.
static int print_address(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Iterator callback to go over all addresses.
char * emsg
Error response message.
struct GNUNET_HELLO_Message * GNUNET_HELLO_iterate_addresses(const struct GNUNET_HELLO_Message *msg, int return_modified, GNUNET_HELLO_AddressIterator it, void *it_cls)
Iterate over all of the addresses in the HELLO.
Definition: hello.c:254
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
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
int response_code
Response code.
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
json_t * response
JSON response.
int GNUNET_HELLO_is_friend_only(const struct GNUNET_HELLO_Message *h)
Return HELLO type.
Definition: hello.c:89
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
static struct PrintContext * pc_head
Head of list of print contexts.
unsigned int off
Current offset in address_list (counted down).
int friend_only
Hello was friend only, GNUNET_YES or GNUNET_NO.
struct AddressRecord * address_list
List of printable addresses.
static int count_address(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Iterator callback to go over all addresses and count them.
static void dump_pc(struct PrintContext *pc)
Print the collected address information to the console and free pc.
unsigned int address_list_size
Number of addresses allocated in address_list.
struct RequestHandle * handle
RequestHandle.
#define GNUNET_malloc(size)
Wrapper around malloc.
static struct PrintContext * pc_tail
Tail of list of print contexts.
#define GNUNET_free(ptr)
Wrapper around free.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ peerinfo_get()

void peerinfo_get ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)

Handle peerinfo GET request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 626 of file plugin_rest_peerinfo.c.

References GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_CRYPTO_hash(), GNUNET_NO, GNUNET_PEERINFO_iterate(), GNUNET_REST_PEERINFO_FRIEND, GNUNET_REST_PEERINFO_PEER, GNUNET_YES, handle, include_friend_only, RequestHandle::list_it, RequestHandle::peerinfo_handle, peerinfo_list_iteration(), and GNUNET_REST_RequestHandle::url_param_map.

Referenced by init_cont().

629 {
630  struct RequestHandle *handle = cls;
631  struct GNUNET_HashCode key;
632  const struct GNUNET_PeerIdentity *specific_peer;
633  // GNUNET_PEER_Id peer_id;
635  char*include_friend_only_str;
636 
637  include_friend_only = GNUNET_NO;
640  &key);
641  if (GNUNET_YES
643  &key))
644  {
645  include_friend_only_str = GNUNET_CONTAINER_multihashmap_get (
646  con_handle->url_param_map, &key);
647  if (0 == strcmp (include_friend_only_str, "yes"))
648  {
649  include_friend_only = GNUNET_YES;
650  }
651  }
652 
653  specific_peer = NULL;
655  strlen (GNUNET_REST_PEERINFO_PEER),
656  &key);
657  if (GNUNET_YES
659  &key))
660  {
661  // peer_id = *(unsigned int*)GNUNET_CONTAINER_multihashmap_get (con_handle->url_param_map, &key);
662  // specific_peer = GNUNET_PEER_resolve2(peer_id);
663  }
664 
666  include_friend_only,
667  specific_peer,
669  handle);
670 }
void peerinfo_list_iteration(void *cls, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_HELLO_Message *hello, const char *err_msg)
Callback that processes each of the known HELLOs for the iteration response construction.
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
static int include_friend_only
Option &#39;-f&#39;.
#define GNUNET_NO
Definition: gnunet_common.h:78
int GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL)...
The request handle.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
struct GNUNET_PEERINFO_IteratorContext * GNUNET_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.
Definition: peerinfo_api.c:487
struct GNUNET_NAMESTORE_ZoneIterator * list_it
Handle to NAMESTORE it.
struct GNUNET_CONTAINER_MultiHashMap * url_param_map
Map of url parameters.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:48
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
A 512-bit hashcode.
struct GNUNET_HashCode key
The key used in the DHT.
#define GNUNET_REST_PEERINFO_PEER
Peerinfo parameter peer.
The identity of the host (wraps the signing key of the peer).
#define GNUNET_YES
Definition: gnunet_common.h:77
#define GNUNET_REST_PEERINFO_FRIEND
Peerinfo parameter friend.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ options_cont()

static void options_cont ( struct GNUNET_REST_RequestHandle con_handle,
const char *  url,
void *  cls 
)
static

Respond to OPTIONS request.

Parameters
con_handlethe connection handle
urlthe url
clsthe RequestHandle

Definition at line 681 of file plugin_rest_peerinfo.c.

References allow_methods, cleanup_handle(), GNUNET_REST_create_response(), GNUNET_SCHEDULER_add_now(), handle, RequestHandle::proc, and RequestHandle::proc_cls.

Referenced by init_cont().

684 {
685  struct MHD_Response *resp;
686  struct RequestHandle *handle = cls;
687 
688  // independent of path return all options
689  resp = GNUNET_REST_create_response (NULL);
690  MHD_add_response_header (resp,
691  "Access-Control-Allow-Methods",
692  allow_methods);
693  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
695  return;
696 }
static char * allow_methods
HTTP methods allows for this plugin.
GNUNET_REST_ResultProcessor proc
The plugin result processor.
void * proc_cls
The closure of the result processor.
The request handle.
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
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
static void cleanup_handle(void *cls)
Cleanup lookup handle.
struct MHD_Response * GNUNET_REST_create_response(const char *data)
Create REST MHD response.
Definition: rest.c:57
Here is the call graph for this function:
Here is the caller graph for this function:

◆ init_cont()

static void init_cont ( struct RequestHandle handle)
static

Handle rest request.

Parameters
handlethe request handle

Definition at line 705 of file plugin_rest_peerinfo.c.

References do_error(), GNUNET_REST_RequestHandlerError::error_code, GNUNET_NO, GNUNET_REST_API_NS_PEERINFO, GNUNET_REST_handle_request(), GNUNET_REST_HANDLER_END, GNUNET_SCHEDULER_add_now(), options_cont(), peerinfo_get(), RequestHandle::response_code, and RequestHandle::rest_handle.

Referenced by rest_process_request().

706 {
708  static const struct GNUNET_REST_RequestHandler handlers[] = {
709  { MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_PEERINFO, &peerinfo_get },
710  { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_PEERINFO, &options_cont },
712  };
713 
715  handlers,
716  &err,
717  handle))
718  {
719  handle->response_code = err.error_code;
721  }
722 }
void peerinfo_get(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Handle peerinfo GET request.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_REST_HANDLER_END
#define GNUNET_REST_API_NS_PEERINFO
Peerinfo Namespace.
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
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
int GNUNET_REST_handle_request(struct GNUNET_REST_RequestHandle *conn, const struct GNUNET_REST_RequestHandler *handlers, struct GNUNET_REST_RequestHandlerError *err, void *cls)
Definition: rest.c:77
struct GNUNET_REST_RequestHandle * rest_handle
Rest connection.
int response_code
Response code.
static void options_cont(struct GNUNET_REST_RequestHandle *con_handle, const char *url, void *cls)
Respond to OPTIONS request.
static void do_error(void *cls)
Task run on errors.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rest_process_request()

static void rest_process_request ( struct GNUNET_REST_RequestHandle rest_handle,
GNUNET_REST_ResultProcessor  proc,
void *  proc_cls 
)
static

Function processing the REST call.

Parameters
methodHTTP method
urlURL of the HTTP request
databody of the HTTP request (optional)
data_sizelength of the body
proccallback function for the result
proc_clsclosure for callback function
Returns
GNUNET_OK if request accepted

Definition at line 737 of file plugin_rest_peerinfo.c.

References do_error(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_PEERINFO_connect(), GNUNET_SCHEDULER_add_delayed(), GNUNET_strdup, GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_SECONDS, handle, init_cont(), RequestHandle::peerinfo_handle, RequestHandle::proc, RequestHandle::proc_cls, RequestHandle::response_code, RequestHandle::rest_handle, RequestHandle::timeout, RequestHandle::timeout_task, GNUNET_REST_RequestHandle::url, and RequestHandle::url.

Referenced by libgnunet_plugin_rest_peerinfo_init().

740 {
741  struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
742 
743  handle->response_code = 0;
745  60);
746  handle->proc_cls = proc_cls;
747  handle->proc = proc;
748  handle->rest_handle = rest_handle;
749 
750  handle->url = GNUNET_strdup (rest_handle->url);
751  if (handle->url[strlen (handle->url) - 1] == '/')
752  handle->url[strlen (handle->url) - 1] = '\0';
753  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
755  init_cont (handle);
756  handle->timeout_task =
758  &do_error,
759  handle);
760 
761  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
762 }
struct GNUNET_PEERINFO_Handle * peerinfo_handle
Handle to PEERINFO.
struct GNUNET_PEERINFO_Handle * GNUNET_PEERINFO_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the peerinfo service.
Definition: peerinfo_api.c:130
GNUNET_REST_ResultProcessor proc
The plugin result processor.
#define GNUNET_TIME_UNIT_SECONDS
One second.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
void * proc_cls
The closure of the result processor.
The request handle.
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed(struct GNUNET_TIME_Relative delay, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1253
const char * url
The url as string.
static void init_cont(struct RequestHandle *handle)
Handle rest request.
struct GNUNET_TIME_Relative timeout
Desired timeout for the lookup (default is no timeout).
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:442
struct GNUNET_REST_RequestHandle * rest_handle
Rest connection.
int response_code
Response code.
struct GNUNET_SCHEDULER_Task * timeout_task
ID of a task associated with the resolution process.
#define GNUNET_log(kind,...)
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
static void do_error(void *cls)
Task run on errors.
char * url
The url.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ libgnunet_plugin_rest_peerinfo_init()

void* libgnunet_plugin_rest_peerinfo_init ( void *  cls)

Entry point for the plugin.

Parameters
clsConfig info
Returns
NULL on error, otherwise the plugin context

Definition at line 772 of file plugin_rest_peerinfo.c.

References _, allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_asprintf(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_REST_API_NS_PEERINFO, GNUNET_REST_Plugin::name, plugin, GNUNET_REST_Plugin::process_request, and rest_process_request().

773 {
774  static struct Plugin plugin;
775  struct GNUNET_REST_Plugin *api;
776 
777  cfg = cls;
778  if (NULL != plugin.cfg)
779  return NULL; /* can only initialize once! */
780  memset (&plugin, 0, sizeof(struct Plugin));
781  plugin.cfg = cfg;
782  api = GNUNET_new (struct GNUNET_REST_Plugin);
783  api->cls = &plugin;
787  "%s, %s, %s, %s, %s",
788  MHD_HTTP_METHOD_GET,
789  MHD_HTTP_METHOD_POST,
790  MHD_HTTP_METHOD_PUT,
791  MHD_HTTP_METHOD_DELETE,
792  MHD_HTTP_METHOD_OPTIONS);
793 
795  _ ("Peerinfo REST API initialized\n"));
796  return api;
797 }
static char * allow_methods
HTTP methods allows for this plugin.
void * cls
The closure of the plugin.
struct returned by the initialization function of the plugin
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void(* process_request)(struct GNUNET_REST_RequestHandle *handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function to process a REST call.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
#define GNUNET_REST_API_NS_PEERINFO
Peerinfo Namespace.
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
char * name
Plugin name.
static char * plugin
Solver plugin name as string.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_log(kind,...)
static void rest_process_request(struct GNUNET_REST_RequestHandle *rest_handle, GNUNET_REST_ResultProcessor proc, void *proc_cls)
Function processing the REST call.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration handle.
Here is the call graph for this function:

◆ libgnunet_plugin_rest_peerinfo_done()

void* libgnunet_plugin_rest_peerinfo_done ( void *  cls)

Exit point from the plugin.

Parameters
clsthe plugin context (as returned by "init")
Returns
always NULL

Definition at line 807 of file plugin_rest_peerinfo.c.

References allow_methods, Plugin::api, Plugin::cfg, GNUNET_REST_Plugin::cls, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_free_non_null, GNUNET_log, and plugin.

808 {
809  struct GNUNET_REST_Plugin *api = cls;
810  struct Plugin *plugin = api->cls;
811 
812  plugin->cfg = NULL;
813 
815  GNUNET_free (api);
817  "Peerinfo REST plugin is finished\n");
818  return NULL;
819 }
static char * allow_methods
HTTP methods allows for this plugin.
void * cls
The closure of the plugin.
const struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
struct returned by the initialization function of the plugin
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
static char * plugin
Solver plugin name as string.
Handle for a plugin.
Definition: block.c:37
#define GNUNET_log(kind,...)
#define GNUNET_free(ptr)
Wrapper around free.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg

The configuration handle.

Handle to our configuration.

Definition at line 68 of file plugin_rest_peerinfo.c.

◆ allow_methods

char* allow_methods
static

HTTP methods allows for this plugin.

Definition at line 73 of file plugin_rest_peerinfo.c.

Referenced by libgnunet_plugin_rest_peerinfo_done(), libgnunet_plugin_rest_peerinfo_init(), and options_cont().

◆ pc_head

struct PrintContext* pc_head
static

Head of list of print contexts.

Definition at line 165 of file plugin_rest_peerinfo.c.

◆ pc_tail

struct PrintContext* pc_tail
static

Tail of list of print contexts.

Definition at line 170 of file plugin_rest_peerinfo.c.