GNUnet  0.11.x
Macros | Functions | Variables
gnunet-scalarproduct.c File Reference

scalarproduct client More...

#include <gcrypt.h>
#include <inttypes.h>
#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_scalarproduct_service.h"
#include "gnunet_protocols.h"
#include "scalarproduct.h"
Include dependency graph for gnunet-scalarproduct.c:

Go to the source code of this file.

Macros

#define GCRYPT_NO_DEPRECATED
 
#define LOG(kind, ...)
 

Functions

static void responder_callback (void *cls, enum GNUNET_SCALARPRODUCT_ResponseStatus status)
 Callback called if we are initiating a new computation session. More...
 
static void requester_callback (void *cls, enum GNUNET_SCALARPRODUCT_ResponseStatus status, gcry_mpi_t result)
 Callback called if we are initiating a new computation session. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Main function that will be run by the scheduler. More...
 
int main (int argc, char *const *argv)
 The main function to the scalarproduct client. More...
 

Variables

static struct GNUNET_HashCode session_key
 the session key identifying this computation More...
 
static struct GNUNET_PeerIdentity peer_id
 PeerID we want to compute a scalar product with. More...
 
static char * input_peer_id
 Option -p: destination peer identity for checking message-ids with. More...
 
static char * input_session_key
 Option -p: destination peer identity for checking message-ids with. More...
 
static char * input_elements
 Option -e: vector to calculate a scalarproduct with. More...
 
static int ret = -1
 Global return value. More...
 
static struct GNUNET_SCALARPRODUCT_ComputationHandlecomputation
 our Scalarproduct Computation handle More...
 

Detailed Description

scalarproduct client

Author
Christian M. Fuchs

Definition in file gnunet-scalarproduct.c.

Macro Definition Documentation

◆ GCRYPT_NO_DEPRECATED

#define GCRYPT_NO_DEPRECATED

Definition at line 26 of file gnunet-scalarproduct.c.

◆ LOG

#define LOG (   kind,
  ... 
)
Value:
GNUNET_log_from (kind, "gnunet-scalarproduct", \
__VA_ARGS__)
#define GNUNET_log_from(kind, comp,...)

Definition at line 36 of file gnunet-scalarproduct.c.

Referenced by requester_callback(), responder_callback(), and run().

Function Documentation

◆ responder_callback()

static void responder_callback ( void *  cls,
enum GNUNET_SCALARPRODUCT_ResponseStatus  status 
)
static

Callback called if we are initiating a new computation session.

Parameters
clsunused
statusif our job was successfully processed

Definition at line 83 of file gnunet-scalarproduct.c.

References GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_h2s(), GNUNET_SCALARPRODUCT_STATUS_DISCONNECTED, GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SCALARPRODUCT_STATUS_INVALID_RESPONSE, GNUNET_SCALARPRODUCT_STATUS_SUCCESS, GNUNET_SCHEDULER_shutdown(), LOG, ret, and session_key.

Referenced by run().

85 {
86  switch (status)
87  {
89  ret = 0;
91  "Session %s concluded.\n",
93  break;
94 
97  "Session %s failed: invalid response\n",
99  break;
100 
103  "Session %s failed: service failure\n",
105  break;
106 
109  "Session %s failed: service disconnect!\n",
111  break;
112 
113  default:
115  "Session %s failed: return code %d\n",
117  status);
118  }
119  computation = NULL;
121 }
static int ret
Global return value.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
static struct GNUNET_HashCode session_key
the session key identifying this computation
static struct GNUNET_SCALARPRODUCT_ComputationHandle * computation
our Scalarproduct Computation handle
uint16_t status
See PRISM_STATUS_*-constants.
We got disconnected from the SCALARPRODUCT service.
#define LOG(kind,...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ requester_callback()

static void requester_callback ( void *  cls,
enum GNUNET_SCALARPRODUCT_ResponseStatus  status,
gcry_mpi_t  result 
)
static

Callback called if we are initiating a new computation session.

Parameters
clsunused
statusif our job was successfully processed
resultthe result in gnu/gcry MPI format

Definition at line 132 of file gnunet-scalarproduct.c.

References buf, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_i2s(), GNUNET_SCALARPRODUCT_STATUS_DISCONNECTED, GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SCALARPRODUCT_STATUS_INVALID_RESPONSE, GNUNET_SCALARPRODUCT_STATUS_SUCCESS, GNUNET_SCHEDULER_shutdown(), LOG, LOG_GCRY, peer_id, ret, and session_key.

Referenced by run().

135 {
136  unsigned char *buf;
137  gcry_error_t rc;
138 
139  switch (status)
140  {
142  if (0 == (rc = gcry_mpi_aprint (GCRYMPI_FMT_HEX, &buf, NULL, result)))
143  {
144  ret = 0;
145  fprintf (stdout,
146  "%s\n",
147  buf);
148  fflush (stdout);
149  }
150  else
152  "gcry_mpi_aprint",
153  rc);
154  break;
155 
158  "Session %s with peer %s failed: invalid response received\n",
160  GNUNET_i2s (&peer_id));
161  break;
162 
165  "Session %s with peer %s failed: API failure\n",
167  GNUNET_i2s (&peer_id));
168  break;
169 
172  "Session %s with peer %s was disconnected from service.\n",
174  GNUNET_i2s (&peer_id));
175  break;
176 
177  default:
179  "Session %s with peer %s failed: return code %d\n",
181  GNUNET_i2s (&peer_id),
182  status);
183  }
184  computation = NULL;
186 }
static int ret
Global return value.
#define LOG_GCRY(level, cmd, rc)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
Definition: scalarproduct.h:35
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:526
static struct GNUNET_HashCode session_key
the session key identifying this computation
static struct GNUNET_SCALARPRODUCT_ComputationHandle * computation
our Scalarproduct Computation handle
uint16_t status
See PRISM_STATUS_*-constants.
static char buf[2048]
static struct GNUNET_PeerIdentity peer_id
PeerID we want to compute a scalar product with.
static int result
Global testing status.
We got disconnected from the SCALARPRODUCT service.
#define LOG(kind,...)
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:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused
tcunused

Definition at line 196 of file gnunet-scalarproduct.c.

References GNUNET_SCALARPRODUCT_cancel(), and ret.

Referenced by run().

197 {
198  if (NULL != computation)
199  {
201  ret = 1; /* aborted */
202  }
203 }
static int ret
Global return value.
void GNUNET_SCALARPRODUCT_cancel(struct GNUNET_SCALARPRODUCT_ComputationHandle *h)
Cancel an ongoing computation or revoke our collaboration offer.
static struct GNUNET_SCALARPRODUCT_ComputationHandle * computation
our Scalarproduct Computation handle
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
char *const *  args,
const char *  cfgfile,
const struct GNUNET_CONFIGURATION_Handle cfg 
)
static

Main function that will be run by the scheduler.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 215 of file gnunet-scalarproduct.c.

References _, end, GNUNET_CRYPTO_eddsa_public_key_from_string(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_htonll(), GNUNET_malloc, GNUNET_OK, GNUNET_SCALARPRODUCT_accept_computation(), GNUNET_SCALARPRODUCT_start_computation(), GNUNET_SCHEDULER_add_shutdown(), input_elements, input_peer_id, input_session_key, GNUNET_SCALARPRODUCT_Element::key, LOG, peer_id, GNUNET_PeerIdentity::public_key, requester_callback(), responder_callback(), ret, session_key, shutdown_task(), and GNUNET_SCALARPRODUCT_Element::value.

Referenced by main().

219 {
220  char *begin = input_elements;
221  char *end;
222  unsigned int i;
223  struct GNUNET_SCALARPRODUCT_Element *elements;
224  uint32_t element_count = 0;
225 
226  if (NULL == input_elements)
227  {
229  _ ("You must specify at least one message ID to check!\n"));
230  return;
231  }
232  if ((NULL == input_session_key) ||
233  (0 == strlen (input_session_key)))
234  {
236  _ (
237  "This program needs a session identifier for comparing vectors.\n"));
238  return;
239  }
241  strlen (input_session_key),
242  &session_key);
243  if ((NULL != input_peer_id) &&
244  (GNUNET_OK !=
246  strlen (input_peer_id),
247  &peer_id.public_key)))
248  {
250  _ ("Tried to set initiator mode, as peer ID was given. "
251  "However, `%s' is not a valid peer identifier.\n"),
252  input_peer_id);
253  return;
254  }
255  if (('\'' == *begin) &&
256  ('\'' == begin[strlen (begin) - 1]))
257  {
258  begin[strlen (begin) - 1] = '\0';
259  if (strlen (begin) > 0)
260  begin++;
261  }
262  for (end = begin; 0 != *end; end++)
263  if (*end == ';')
264  element_count++;
265  if (0 == element_count)
266  {
268  _ ("Need elements to compute the scalarproduct, got none.\n"));
269  return;
270  }
271 
272  elements = GNUNET_malloc (sizeof(struct GNUNET_SCALARPRODUCT_Element)
273  * element_count);
274 
275  for (i = 0; i < element_count; i++)
276  {
277  struct GNUNET_SCALARPRODUCT_Element element;
278  char*separator = NULL;
279 
280  /* get the length of the current key,value; tupel */
281  for (end = begin; *end != ';'; end++)
282  if (*end == ',')
283  separator = end;
284 
285  /* final element */
286  if ((NULL == separator) ||
287  (begin == separator) ||
288  (separator == end - 1))
289  {
291  _ ("Malformed input, could not parse `%s'\n"),
292  begin);
293  GNUNET_free (elements);
294  return;
295  }
296  *separator = 0;
297  /* read the element's key */
298  GNUNET_CRYPTO_hash (begin,
299  strlen (begin),
300  &element.key);
301 
302  /* read the element's value */
303  if (1 !=
304  sscanf (separator + 1,
305  "%" SCNd64 ";",
306  &element.value))
307  {
309  _ ("Could not convert `%s' to int64_t.\n"),
310  begin);
311  GNUNET_free (elements);
312  return;
313  }
314  element.value = GNUNET_htonll (element.value);
315  elements[i] = element;
316  begin = end + 1;
317  }
318 
319  if (((NULL != input_peer_id) &&
320  (NULL == (computation
322  &session_key,
323  &peer_id,
324  elements,
325  element_count,
327  NULL)))) ||
328  ((NULL == input_peer_id) &&
329  (NULL == (computation
331  &session_key,
332  elements,
333  element_count,
334  &
336  NULL)))))
337  {
338  fprintf (stderr,
339  _ ("Failed to initiate computation, were all keys unique?\n"));
340  GNUNET_free (elements);
341  return;
342  }
343  GNUNET_free (elements);
345  NULL);
346  ret = 0;
347 }
static int ret
Global return value.
static char * input_peer_id
Option -p: destination peer identity for checking message-ids with.
static void shutdown_task(void *cls)
Task run during shutdown.
static int end
Set if we are to shutdown all services (including ARM).
Definition: gnunet-arm.c:34
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received, or when GNUNET_SCHEDULER_shutdown() is being invoked.
Definition: scheduler.c:1300
struct GNUNET_SCALARPRODUCT_ComputationHandle * GNUNET_SCALARPRODUCT_accept_computation(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HashCode *key, const struct GNUNET_SCALARPRODUCT_Element *elements, uint32_t element_count, GNUNET_SCALARPRODUCT_ContinuationWithStatus cont, void *cont_cls)
Used by Bob&#39;s client to cooperate with Alice,.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
static char * input_session_key
Option -p: destination peer identity for checking message-ids with.
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static struct GNUNET_HashCode session_key
the session key identifying this computation
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_SCALARPRODUCT_ComputationHandle * computation
our Scalarproduct Computation handle
static void responder_callback(void *cls, enum GNUNET_SCALARPRODUCT_ResponseStatus status)
Callback called if we are initiating a new computation session.
static struct GNUNET_PeerIdentity peer_id
PeerID we want to compute a scalar product with.
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:35
int GNUNET_CRYPTO_eddsa_public_key_from_string(const char *enc, size_t enclen, struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Convert a string representing a public key to a public key.
Definition: crypto_ecc.c:499
static void requester_callback(void *cls, enum GNUNET_SCALARPRODUCT_ResponseStatus status, gcry_mpi_t result)
Callback called if we are initiating a new computation session.
static char * input_elements
Option -e: vector to calculate a scalarproduct with.
#define LOG(kind,...)
struct GNUNET_SCALARPRODUCT_ComputationHandle * GNUNET_SCALARPRODUCT_start_computation(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HashCode *session_key, const struct GNUNET_PeerIdentity *peer, const struct GNUNET_SCALARPRODUCT_Element *elements, uint32_t element_count, GNUNET_SCALARPRODUCT_DatumProcessor cont, void *cont_cls)
Request by Alice&#39;s client for computing a scalar product.
#define GNUNET_malloc(size)
Wrapper around malloc.
An element key-value pair for scalarproduct.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_CRYPTO_EddsaPublicKey public_key
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char *const *  argv 
)

The main function to the scalarproduct client.

Parameters
argcnumber of arguments from the command line
argvcommand line arguments
Returns
0 ok, 1 on error

Definition at line 358 of file gnunet-scalarproduct.c.

References gettext_noop, GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_string(), GNUNET_OK, GNUNET_PROGRAM_run(), input_elements, input_peer_id, input_session_key, ret, and run().

359 {
362  "elements",
363  "\"key1,val1;key2,val2;...,keyn,valn;\"",
364  gettext_noop (
365  "A comma separated list of elements to compare as vector with our remote peer."),
366  &input_elements),
367 
369  "elements",
370  "\"key1,val1;key2,val2;...,keyn,valn;\"",
371  gettext_noop (
372  "A comma separated list of elements to compare as vector with our remote peer."),
373  &input_elements),
374 
376  "peer",
377  "PEERID",
378  gettext_noop (
379  "[Optional] peer to calculate our scalarproduct with. If this parameter is not given, the service will wait for a remote peer to compute the request."),
380  &input_peer_id),
381 
383  "key",
384  "TRANSACTION_ID",
385  gettext_noop (
386  "Transaction ID shared with peer."),
388 
390  };
391 
392  return (GNUNET_OK ==
393  GNUNET_PROGRAM_run (argc,
394  argv,
395  "gnunet-scalarproduct",
396  gettext_noop (
397  "Calculate the Vectorproduct with a GNUnet peer."),
398  options, &run, NULL)) ? ret : 1;
399 }
static int ret
Global return value.
static char * input_peer_id
Option -p: destination peer identity for checking message-ids with.
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
Main function that will be run by the scheduler.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Definition of a command line option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
static char * input_session_key
Option -p: destination peer identity for checking message-ids with.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
int GNUNET_PROGRAM_run(int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).
Definition: program.c:367
static char * input_elements
Option -e: vector to calculate a scalarproduct with.
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

Variable Documentation

◆ session_key

struct GNUNET_HashCode session_key
static

the session key identifying this computation

Definition at line 43 of file gnunet-scalarproduct.c.

Referenced by GNUNET_SCALARPRODUCT_accept_computation(), GNUNET_SCALARPRODUCT_start_computation(), requester_callback(), responder_callback(), and run().

◆ peer_id

struct GNUNET_PeerIdentity peer_id
static

PeerID we want to compute a scalar product with.

Definition at line 48 of file gnunet-scalarproduct.c.

Referenced by requester_callback(), and run().

◆ input_peer_id

char* input_peer_id
static

Option -p: destination peer identity for checking message-ids with.

Definition at line 53 of file gnunet-scalarproduct.c.

Referenced by main(), and run().

◆ input_session_key

char* input_session_key
static

Option -p: destination peer identity for checking message-ids with.

Definition at line 58 of file gnunet-scalarproduct.c.

Referenced by main(), and run().

◆ input_elements

char* input_elements
static

Option -e: vector to calculate a scalarproduct with.

Definition at line 63 of file gnunet-scalarproduct.c.

Referenced by main(), and run().

◆ ret

int ret = -1
static

Global return value.

Definition at line 68 of file gnunet-scalarproduct.c.

Referenced by main(), requester_callback(), responder_callback(), run(), and shutdown_task().

◆ computation

struct GNUNET_SCALARPRODUCT_ComputationHandle* computation
static

our Scalarproduct Computation handle

Definition at line 73 of file gnunet-scalarproduct.c.