GNUnet  0.11.x
Data Structures | Functions | Variables
gnunet-service-identity.c File Reference

identity management service More...

#include "platform.h"
#include "gnunet_util_lib.h"
#include "gnunet_constants.h"
#include "gnunet_protocols.h"
#include "gnunet_statistics_service.h"
#include "gnunet_identity_service.h"
#include "identity.h"
Include dependency graph for gnunet-service-identity.c:

Go to the source code of this file.

Data Structures

struct  Ego
 Information we keep about each ego. More...
 
struct  RenameContext
 Closure for 'handle_ego_rename'. More...
 

Functions

static char * get_ego_filename (struct Ego *ego)
 Get the name of the file we use to store a given ego. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_ctx)
 Called whenever a client is disconnected. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 Add a client to our list of active clients. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void send_result_code (struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
 Send a result code back to the client. More...
 
static struct GNUNET_MQ_Envelopecreate_update_message (struct Ego *ego)
 Create an update message with information about the current state of an ego. More...
 
static struct GNUNET_MQ_Envelopecreate_set_default_message (struct Ego *ego, const char *servicename)
 Create a set default message with information about the current state of an ego. More...
 
static void handle_start_message (void *cls, const struct GNUNET_MessageHeader *message)
 Handler for START message from client, sends information about all identities to the client immediately and adds the client to the notification context for future updates. More...
 
static int check_lookup_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static void handle_lookup_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static int check_lookup_by_suffix_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP message from client, sends information about ONE identity to the client immediately. More...
 
static void handle_lookup_by_suffix_message (void *cls, const struct LookupMessage *message)
 Handler for LOOKUP_BY_SUFFIX message from client, sends information about ONE identity to the client immediately. More...
 
static int check_get_default_message (void *cls, const struct GetDefaultMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT message. More...
 
static void handle_get_default_message (void *cls, const struct GetDefaultMessage *gdm)
 Handler for GET_DEFAULT message from client, returns default identity for some service. More...
 
static int key_cmp (const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk1, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk2)
 Compare the given two private keys for equality. More...
 
static int check_set_default_message (void *cls, const struct SetDefaultMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT message. More...
 
static void handle_set_default_message (void *cls, const struct SetDefaultMessage *sdm)
 Handler for SET_DEFAULT message from client, updates default identity for some service. More...
 
static void notify_listeners (struct Ego *ego)
 Send an updated message for the given ego to all listeners. More...
 
static int check_create_message (void *cls, const struct CreateRequestMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_CREATE message. More...
 
static void handle_create_message (void *cls, const struct CreateRequestMessage *crm)
 Handler for CREATE message from client, creates new identity. More...
 
static void handle_ego_rename (void *cls, const char *section)
 An ego was renamed; rename it in all subsystems where it is currently set as the default. More...
 
static int check_rename_message (void *cls, const struct RenameMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_RENAME message. More...
 
static void handle_rename_message (void *cls, const struct RenameMessage *rm)
 Handler for RENAME message from client, creates new identity. More...
 
static void handle_ego_delete (void *cls, const char *section)
 An ego was removed, remove it from all subsystems where it is currently set as the default. More...
 
static int check_delete_message (void *cls, const struct DeleteMessage *msg)
 Checks a GNUNET_MESSAGE_TYPE_IDENTITY_DELETE message. More...
 
static void handle_delete_message (void *cls, const struct DeleteMessage *dm)
 Handler for DELETE message from client, creates new identity. More...
 
static int process_ego_file (void *cls, const char *filename)
 Process the given file from the "EGODIR". More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Handle network size estimate clients. More...
 
 GNUNET_SERVICE_MAIN ("identity", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_fixed_size(start_message, GNUNET_MESSAGE_TYPE_IDENTITY_START, struct GNUNET_MessageHeader, NULL), GNUNET_MQ_hd_var_size(lookup_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, struct LookupMessage, NULL), GNUNET_MQ_hd_var_size(lookup_by_suffix_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, struct LookupMessage, NULL), GNUNET_MQ_hd_var_size(get_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, struct GetDefaultMessage, NULL), GNUNET_MQ_hd_var_size(set_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, struct SetDefaultMessage, NULL), GNUNET_MQ_hd_var_size(create_message, GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, struct CreateRequestMessage, NULL), GNUNET_MQ_hd_var_size(rename_message, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, struct RenameMessage, NULL), GNUNET_MQ_hd_var_size(delete_message, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, struct DeleteMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro. More...
 

Variables

static const struct GNUNET_CONFIGURATION_Handlecfg
 Handle to our current configuration. More...
 
static struct GNUNET_CONFIGURATION_Handlesubsystem_cfg
 Handle to subsystem configuration which for each subsystem contains the name of the default ego. More...
 
static struct GNUNET_STATISTICS_Handlestats
 Handle to the statistics service. More...
 
static struct GNUNET_NotificationContextnc
 Notification context, simplifies client broadcasts. More...
 
static char * ego_directory
 Directory where we store the identities. More...
 
static char * subsystem_cfg_file
 Configuration file name where subsystem information is kept. More...
 
static struct Egoego_head
 Head of DLL of all egos. More...
 
static struct Egoego_tail
 Tail of DLL of all egos. More...
 

Detailed Description

identity management service

Author
Christian Grothoff

The purpose of this service is to manage private keys that represent the various egos/pseudonyms/identities of a GNUnet user.

Todo:

Definition in file gnunet-service-identity.c.

Function Documentation

◆ get_ego_filename()

static char* get_ego_filename ( struct Ego ego)
static

Get the name of the file we use to store a given ego.

Parameters
egoego for which we need the filename
Returns
full filename for the given ego

Definition at line 118 of file gnunet-service-identity.c.

References DIR_SEPARATOR_STR, ego_directory, filename, GNUNET_asprintf(), and Ego::identifier.

Referenced by handle_create_message(), handle_delete_message(), and handle_rename_message().

119 {
120  char *filename;
121 
122  GNUNET_asprintf (&filename,
123  "%s%s%s",
126  ego->identifier);
127  return filename;
128 }
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
#define DIR_SEPARATOR_STR
Definition: platform.h:171
static char * filename
char * identifier
String identifier for the ego.
static char * ego_directory
Directory where we store the identities.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_ctx 
)
static

Called whenever a client is disconnected.

Parameters
clsclosure
clientidentification of the client
app_ctxclient

Definition at line 139 of file gnunet-service-identity.c.

References GNUNET_ERROR_TYPE_DEBUG, and GNUNET_log.

Referenced by run().

142 {
144  "Client %p disconnected\n",
145  client);
146 }
#define GNUNET_log(kind,...)
Here is the caller graph for this function:

◆ client_connect_cb()

static void* client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Add a client to our list of active clients.

Parameters
clsNULL
clientclient to add
mqmessage queue for client
Returns
internal namestore client structure for this client

Definition at line 158 of file gnunet-service-identity.c.

Referenced by run().

161 {
162  return client;
163 }
Here is the caller graph for this function:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 172 of file gnunet-service-identity.c.

References e, ego_directory, GNUNET_CONFIGURATION_destroy(), GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_NO, GNUNET_notification_context_destroy(), GNUNET_STATISTICS_destroy(), Ego::identifier, and subsystem_cfg_file.

Referenced by run().

173 {
174  struct Ego *e;
175 
176  if (NULL != nc)
177  {
179  nc = NULL;
180  }
181  if (NULL != stats)
182  {
184  stats = NULL;
185  }
187  subsystem_cfg = NULL;
189  subsystem_cfg_file = NULL;
191  ego_directory = NULL;
192  while (NULL != (e = ego_head))
193  {
195  ego_tail,
196  e);
197  GNUNET_free (e->identifier);
198  GNUNET_free (e);
199  }
200 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
static struct Experiment * e
void GNUNET_STATISTICS_destroy(struct GNUNET_STATISTICS_Handle *h, int sync_first)
Destroy a handle (free all state associated with it).
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
char * identifier
String identifier for the ego.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static char * ego_directory
Directory where we store the identities.
void GNUNET_notification_context_destroy(struct GNUNET_NotificationContext *nc)
Destroy the context, force disconnect for all subscribers.
Definition: nc.c:137
static struct Ego * ego_tail
Tail of DLL of all egos.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_result_code()

static void send_result_code ( struct GNUNET_SERVICE_Client client,
uint32_t  result_code,
const char *  emsg 
)
static

Send a result code back to the client.

Parameters
clientclient that should receive the result code
result_codecode to transmit
emsgerror message to include (or NULL for none)

Definition at line 211 of file gnunet-service-identity.c.

References env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_SERVICE_client_get_mq(), and ResultCodeMessage::result_code.

Referenced by handle_create_message(), handle_delete_message(), handle_get_default_message(), handle_lookup_by_suffix_message(), handle_lookup_message(), handle_rename_message(), and handle_set_default_message().

214 {
215  struct ResultCodeMessage *rcm;
216  struct GNUNET_MQ_Envelope *env;
217  size_t elen;
218 
219  if (NULL == emsg)
220  elen = 0;
221  else
222  elen = strlen (emsg) + 1;
223  env =
225  rcm->result_code = htonl (result_code);
226  if (0 < elen)
227  GNUNET_memcpy (&rcm[1], emsg, elen);
229  "Sending result %d (%s) to client\n",
230  (int) result_code,
231  emsg);
233 }
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2436
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
uint32_t result_code
Status code for the last operation, in NBO.
Definition: identity.h:53
#define GNUNET_log(kind,...)
#define GNUNET_MESSAGE_TYPE_IDENTITY_RESULT_CODE
Generic response from identity service with success and/or error message.
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:355
Answer from service to client about last operation; GET_DEFAULT maybe answered with this message on f...
Definition: identity.h:42
Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_update_message()

static struct GNUNET_MQ_Envelope* create_update_message ( struct Ego ego)
static

Create an update message with information about the current state of an ego.

Parameters
egoego to create message for
Returns
corresponding update message

Definition at line 243 of file gnunet-service-identity.c.

References UpdateMessage::end_of_list, env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_MQ_msg_extra, GNUNET_NO, Ego::identifier, UpdateMessage::name_len, Ego::pk, and UpdateMessage::private_key.

Referenced by handle_lookup_by_suffix_message(), handle_lookup_message(), and handle_start_message().

244 {
245  struct UpdateMessage *um;
246  struct GNUNET_MQ_Envelope *env;
247  size_t name_len;
248 
249  name_len = (NULL == ego->identifier) ? 0 : (strlen (ego->identifier) + 1);
251  um->name_len = htons (name_len);
252  um->end_of_list = htons (GNUNET_NO);
253  um->private_key = ego->pk;
254  GNUNET_memcpy (&um[1], ego->identifier, name_len);
255  return env;
256 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:98
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
char * identifier
String identifier for the ego.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:93
Service informs client about status of a pseudonym.
Definition: identity.h:77
Here is the caller graph for this function:

◆ create_set_default_message()

static struct GNUNET_MQ_Envelope* create_set_default_message ( struct Ego ego,
const char *  servicename 
)
static

Create a set default message with information about the current state of an ego.

Parameters
egoego to create message for
servicenamename of the service to provide in the message
Returns
corresponding set default message

Definition at line 267 of file gnunet-service-identity.c.

References env, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, GNUNET_MQ_msg_extra, SetDefaultMessage::name_len, Ego::pk, SetDefaultMessage::private_key, and SetDefaultMessage::reserved.

Referenced by handle_get_default_message().

269 {
270  struct SetDefaultMessage *sdm;
271  struct GNUNET_MQ_Envelope *env;
272  size_t name_len;
273 
274  name_len = (NULL == servicename) ? 0 : (strlen (servicename) + 1);
275  env = GNUNET_MQ_msg_extra (sdm,
276  name_len,
278  sdm->name_len = htons (name_len);
279  sdm->reserved = htons (0);
280  sdm->private_key = ego->pk;
281  GNUNET_memcpy (&sdm[1], servicename, name_len);
282  return env;
283 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:154
#define GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT
Client sets default identity; or service informs about default identity.
Used from service to client as a result to the GET_DEFAULT message, used from client to service to SE...
Definition: identity.h:134
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:144
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t reserved
Always zero.
Definition: identity.h:149
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
Here is the caller graph for this function:

◆ handle_start_message()

static void handle_start_message ( void *  cls,
const struct GNUNET_MessageHeader message 
)
static

Handler for START message from client, sends information about all identities to the client immediately and adds the client to the notification context for future updates.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 296 of file gnunet-service-identity.c.

References create_update_message(), UpdateMessage::end_of_list, env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_notification_context_add(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_disable_continue_warning(), GNUNET_SERVICE_client_get_mq(), GNUNET_SERVICE_client_mark_monitor(), GNUNET_YES, UpdateMessage::name_len, and Ego::next.

298 {
299  struct GNUNET_SERVICE_Client *client = cls;
300 
302  "Received START message from client\n");
307  for (struct Ego *ego = ego_head; NULL != ego; ego = ego->next)
308  {
310  create_update_message (ego));
311  }
312  {
313  struct UpdateMessage *ume;
314  struct GNUNET_MQ_Envelope *env;
315 
316  env = GNUNET_MQ_msg_extra (ume,
317  0,
319  ume->end_of_list = htons (GNUNET_YES);
320  ume->name_len = htons (0);
322  env);
323  }
325 }
struct Ego * next
We keep egos in a DLL.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2436
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
void GNUNET_notification_context_add(struct GNUNET_NotificationContext *nc, struct GNUNET_MQ_Handle *mq)
Add a subscriber to the notification context.
Definition: nc.c:160
Handle to a client that is connected to a service.
Definition: service.c:250
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
Definition: gnunet_mq_lib.h:52
void GNUNET_SERVICE_client_mark_monitor(struct GNUNET_SERVICE_Client *c)
Set the &#39;monitor&#39; flag on this client.
Definition: service.c:2406
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:93
#define GNUNET_log(kind,...)
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:355
void GNUNET_SERVICE_client_disable_continue_warning(struct GNUNET_SERVICE_Client *c)
Disable the warning the server issues if a message is not acknowledged in a timely fashion...
Definition: service.c:2266
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Service informs client about status of a pseudonym.
Definition: identity.h:77
Here is the call graph for this function:

◆ check_lookup_message()

static int check_lookup_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsunused
messagethe message received
Returns
GNUNET_SYSERR if message was ill-formed

Definition at line 337 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

339 {
341  return GNUNET_OK;
342 }
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_lookup_message()

static void handle_lookup_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 353 of file gnunet-service-identity.c.

References create_update_message(), env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), Ego::identifier, name, Ego::next, and send_result_code().

355 {
356  struct GNUNET_SERVICE_Client *client = cls;
357  const char *name;
358  struct GNUNET_MQ_Envelope *env;
359  struct Ego *ego;
360 
362  "Received LOOKUP message from client\n");
363  name = (const char *) &message[1];
364  for (ego = ego_head; NULL != ego; ego = ego->next)
365  {
366  if (0 != strcasecmp (name, ego->identifier))
367  continue;
368  env = create_update_message (ego);
371  return;
372  }
373  send_result_code (client, 0, "ego not found");
375 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2436
Handle to a client that is connected to a service.
Definition: service.c:250
char * identifier
String identifier for the ego.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
const char * name
#define GNUNET_log(kind,...)
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:355
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Here is the call graph for this function:

◆ check_lookup_by_suffix_message()

static int check_lookup_by_suffix_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP message from client, sends information about ONE identity to the client immediately.

Parameters
clsunused
messagethe message received
Returns
GNUNET_SYSERR if message was ill-formed

Definition at line 387 of file gnunet-service-identity.c.

References GNUNET_MQ_check_zero_termination, and GNUNET_OK.

389 {
391  return GNUNET_OK;
392 }
#define GNUNET_MQ_check_zero_termination(m)
Insert code for a "check_" function that verifies that a given variable-length message received over ...

◆ handle_lookup_by_suffix_message()

static void handle_lookup_by_suffix_message ( void *  cls,
const struct LookupMessage message 
)
static

Handler for LOOKUP_BY_SUFFIX message from client, sends information about ONE identity to the client immediately.

Parameters
clsa struct GNUNET_SERVICE_Client *
messagethe message received

Definition at line 403 of file gnunet-service-identity.c.

References create_update_message(), env, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), Ego::identifier, name, Ego::next, and send_result_code().

405 {
406  struct GNUNET_SERVICE_Client *client = cls;
407  const char *name;
408  struct GNUNET_MQ_Envelope *env;
409  struct Ego *lprefix;
410 
412  "Received LOOKUP_BY_SUFFIX message from client\n");
413  name = (const char *) &message[1];
414  lprefix = NULL;
415  for (struct Ego *ego = ego_head; NULL != ego; ego = ego->next)
416  {
417  if ((strlen (ego->identifier) <= strlen (name)) &&
418  (0 == strcmp (ego->identifier,
419  &name[strlen (name) - strlen (ego->identifier)])) &&
420  ((strlen (name) == strlen (ego->identifier)) ||
421  ('.' == name[strlen (name) - strlen (ego->identifier) - 1])) &&
422  ((NULL == lprefix) ||
423  (strlen (ego->identifier) > strlen (lprefix->identifier))))
424  {
425  /* found better match, update! */
426  lprefix = ego;
427  }
428  }
429  if (NULL != lprefix)
430  {
431  env = create_update_message (lprefix);
434  return;
435  }
436  send_result_code (client, 0, "ego not found");
438 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2436
Handle to a client that is connected to a service.
Definition: service.c:250
char * identifier
String identifier for the ego.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
const char * name
#define GNUNET_log(kind,...)
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:355
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
static struct GNUNET_MQ_Envelope * create_update_message(struct Ego *ego)
Create an update message with information about the current state of an ego.
Here is the call graph for this function:

◆ check_get_default_message()

static int check_get_default_message ( void *  cls,
const struct GetDefaultMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT message.

Parameters
clsclient sending the message
msgmessage of type struct GetDefaultMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 449 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, GetDefaultMessage::header, name, GetDefaultMessage::name_len, GetDefaultMessage::reserved, size, and GNUNET_MessageHeader::size.

451 {
452  uint16_t size;
453  uint16_t name_len;
454  const char *name;
455 
456  size = ntohs (msg->header.size);
457  if (size <= sizeof(struct GetDefaultMessage))
458  {
459  GNUNET_break (0);
460  return GNUNET_SYSERR;
461  }
462  name = (const char *) &msg[1];
463  name_len = ntohs (msg->name_len);
464  if ((name_len + sizeof(struct GetDefaultMessage) != size) ||
465  (0 != ntohs (msg->reserved)) || ('\0' != name[name_len - 1]))
466  {
467  GNUNET_break (0);
468  return GNUNET_SYSERR;
469  }
470  return GNUNET_OK;
471 }
uint16_t reserved
Always zero.
Definition: identity.h:123
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:118
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT.
Definition: identity.h:113
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
static unsigned int size
Size of the "table".
Definition: peer.c:67
const char * name
Client requests knowledge about default identity for a subsystem from identity service.
Definition: identity.h:108

◆ handle_get_default_message()

static void handle_get_default_message ( void *  cls,
const struct GetDefaultMessage gdm 
)
static

Handler for GET_DEFAULT message from client, returns default identity for some service.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 483 of file gnunet-service-identity.c.

References create_set_default_message(), env, gettext_noop, GNUNET_CONFIGURATION_get_value_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MQ_send(), GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_get_mq(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, name, Ego::next, and send_result_code().

485 {
486  struct GNUNET_MQ_Envelope *env;
487  struct GNUNET_SERVICE_Client *client = cls;
488  char *name;
489  char *identifier;
490 
491  name = GNUNET_strdup ((const char *) &gdm[1]);
492  GNUNET_STRINGS_utf8_tolower ((const char *) &gdm[1],
493  name);
495  "Received GET_DEFAULT for service `%s' from client\n",
496  name);
497  if (GNUNET_OK !=
499  name,
500  "DEFAULT_IDENTIFIER",
501  &identifier))
502  {
503  send_result_code (client, 1, gettext_noop ("no default known"));
505  GNUNET_free (name);
506  return;
507  }
508  for (struct Ego *ego = ego_head; NULL != ego; ego = ego->next)
509  {
510  if (0 == strcmp (ego->identifier, identifier))
511  {
512  env = create_set_default_message (ego, name);
515  GNUNET_free (identifier);
516  GNUNET_free (name);
517  return;
518  }
519  }
520  GNUNET_free (identifier);
522  "Failed to find ego `%s'\n",
523  name);
524  GNUNET_free (name);
525  send_result_code (client,
526  1,
527  gettext_noop (
528  "default configured, but ego unknown (internal error)"));
530 }
struct Ego * next
We keep egos in a DLL.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
struct GNUNET_MQ_Handle * GNUNET_SERVICE_client_get_mq(struct GNUNET_SERVICE_Client *c)
Obtain the message queue of c.
Definition: service.c:2436
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Handle to a client that is connected to a service.
Definition: service.c:250
static struct GNUNET_MQ_Envelope * create_set_default_message(struct Ego *ego, const char *servicename)
Create a set default message with information about the current state of an ego.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
const char * name
#define GNUNET_log(kind,...)
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:355
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:567
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ key_cmp()

static int key_cmp ( const struct GNUNET_CRYPTO_EcdsaPrivateKey pk1,
const struct GNUNET_CRYPTO_EcdsaPrivateKey pk2 
)
static

Compare the given two private keys for equality.

Parameters
pk1one private key
pk2another private key
Returns
0 if the keys are equal

Definition at line 541 of file gnunet-service-identity.c.

References GNUNET_memcmp.

Referenced by handle_set_default_message().

543 {
544  return GNUNET_memcmp (pk1, pk2);
545 }
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
Here is the caller graph for this function:

◆ check_set_default_message()

static int check_set_default_message ( void *  cls,
const struct SetDefaultMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT message.

Parameters
clsclient sending the message
msgmessage of type struct SetDefaultMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 556 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, SetDefaultMessage::header, SetDefaultMessage::name_len, SetDefaultMessage::reserved, size, and GNUNET_MessageHeader::size.

558 {
559  uint16_t size;
560  uint16_t name_len;
561  const char *str;
562 
563  size = ntohs (msg->header.size);
564  if (size <= sizeof(struct SetDefaultMessage))
565  {
566  GNUNET_break (0);
567  return GNUNET_SYSERR;
568  }
569  name_len = ntohs (msg->name_len);
570  GNUNET_break (0 == ntohs (msg->reserved));
571  if (name_len + sizeof(struct SetDefaultMessage) != size)
572  {
573  GNUNET_break (0);
574  return GNUNET_SYSERR;
575  }
576  str = (const char *) &msg[1];
577  if ('\0' != str[name_len - 1])
578  {
579  GNUNET_break (0);
580  return GNUNET_SYSERR;
581  }
582  return GNUNET_OK;
583 }
Used from service to client as a result to the GET_DEFAULT message, used from client to service to SE...
Definition: identity.h:134
uint16_t name_len
Number of bytes in service name string including 0-termination, in NBO.
Definition: identity.h:144
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint16_t reserved
Always zero.
Definition: identity.h:149
static unsigned int size
Size of the "table".
Definition: peer.c:67
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT.
Definition: identity.h:139

◆ handle_set_default_message()

static void handle_set_default_message ( void *  cls,
const struct SetDefaultMessage sdm 
)
static

Handler for SET_DEFAULT message from client, updates default identity for some service.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 595 of file gnunet-service-identity.c.

References _, GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, key_cmp(), Ego::next, Ego::pk, send_result_code(), and subsystem_cfg_file.

597 {
598  struct Ego *ego;
599  struct GNUNET_SERVICE_Client *client = cls;
600  char *str;
601 
602  str = GNUNET_strdup ((const char *) &sdm[1]);
603  GNUNET_STRINGS_utf8_tolower ((const char *) &sdm[1], str);
604 
606  "Received SET_DEFAULT for service `%s' from client\n",
607  str);
608  for (ego = ego_head; NULL != ego; ego = ego->next)
609  {
610  if (0 == key_cmp (&ego->pk,
611  &sdm->private_key))
612  {
614  str,
615  "DEFAULT_IDENTIFIER",
616  ego->identifier);
617  if (GNUNET_OK !=
619  GNUNET_log (
621  _ ("Failed to write subsystem default identifier map to `%s'.\n"),
623  send_result_code (client, 0, NULL);
625  GNUNET_free (str);
626  return;
627  }
628  }
629  send_result_code (client,
630  1,
631  _ ("Unknown ego specified for service (internal error)"));
632  GNUNET_free (str);
634 }
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:154
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
Handle to a client that is connected to a service.
Definition: service.c:250
char * identifier
String identifier for the ego.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static int key_cmp(const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk1, const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk2)
Compare the given two private keys for equality.
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
#define GNUNET_log(kind,...)
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:567
Here is the call graph for this function:

◆ notify_listeners()

static void notify_listeners ( struct Ego ego)
static

Send an updated message for the given ego to all listeners.

Parameters
egoego to send the update for

Definition at line 643 of file gnunet-service-identity.c.

References UpdateMessage::end_of_list, GNUNET_free, GNUNET_malloc, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE, GNUNET_NO, GNUNET_notification_context_broadcast(), UpdateMessage::header, Ego::identifier, UpdateMessage::name_len, Ego::pk, UpdateMessage::private_key, GNUNET_MessageHeader::size, and GNUNET_MessageHeader::type.

Referenced by handle_create_message(), handle_delete_message(), and handle_rename_message().

644 {
645  struct UpdateMessage *um;
646  size_t name_len;
647 
648  name_len = (NULL == ego->identifier) ? 0 : (strlen (ego->identifier) + 1);
649  um = GNUNET_malloc (sizeof(struct UpdateMessage) + name_len);
651  um->header.size = htons (sizeof(struct UpdateMessage) + name_len);
652  um->name_len = htons (name_len);
653  um->end_of_list = htons (GNUNET_NO);
654  um->private_key = ego->pk;
655  GNUNET_memcpy (&um[1], ego->identifier, name_len);
657  GNUNET_free (um);
658 }
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE.
Definition: identity.h:82
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:98
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_MESSAGE_TYPE_IDENTITY_UPDATE
Update about identity status from service to clients.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint16_t type
The type of the message (GNUNET_MESSAGE_TYPE_XXXX), in big-endian format.
char * identifier
String identifier for the ego.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88
void GNUNET_notification_context_broadcast(struct GNUNET_NotificationContext *nc, const struct GNUNET_MessageHeader *msg, int can_drop)
Send a message to all subscribers of this context.
Definition: nc.c:189
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
uint16_t end_of_list
Usually GNUNET_NO, GNUNET_YES to signal end of list.
Definition: identity.h:93
#define GNUNET_malloc(size)
Wrapper around malloc.
Service informs client about status of a pseudonym.
Definition: identity.h:77
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_create_message()

static int check_create_message ( void *  cls,
const struct CreateRequestMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_CREATE message.

Parameters
clsclient sending the message
msgmessage of type struct CreateRequestMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 669 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, CreateRequestMessage::header, UpdateMessage::name_len, CreateRequestMessage::name_len, CreateRequestMessage::reserved, size, and GNUNET_MessageHeader::size.

671 {
672  uint16_t size;
673  uint16_t name_len;
674  const char *str;
675 
676  size = ntohs (msg->header.size);
677  if (size <= sizeof(struct CreateRequestMessage))
678  {
679  GNUNET_break (0);
680  return GNUNET_SYSERR;
681  }
682  name_len = ntohs (msg->name_len);
683  GNUNET_break (0 == ntohs (msg->reserved));
684  if (name_len + sizeof(struct CreateRequestMessage) != size)
685  {
686  GNUNET_break (0);
687  return GNUNET_SYSERR;
688  }
689  str = (const char *) &msg[1];
690  if ('\0' != str[name_len - 1])
691  {
692  GNUNET_break (0);
693  return GNUNET_SYSERR;
694  }
695  return GNUNET_OK;
696 }
uint16_t reserved
Always zero.
Definition: identity.h:179
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_CREATE.
Definition: identity.h:169
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
uint16_t name_len
Number of bytes in identity name string including 0-termination, in NBO.
Definition: identity.h:174
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
Client requests creation of an identity.
Definition: identity.h:164
static unsigned int size
Size of the "table".
Definition: peer.c:67
uint16_t name_len
Number of bytes in ego name string including 0-termination, in NBO; 0 if the ego was deleted...
Definition: identity.h:88

◆ handle_create_message()

static void handle_create_message ( void *  cls,
const struct CreateRequestMessage crm 
)
static

Handler for CREATE message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 708 of file gnunet-service-identity.c.

References fn, get_ego_filename(), gettext_noop, GNUNET_CONTAINER_DLL_insert, GNUNET_DISK_directory_create_for_file(), GNUNET_DISK_fn_write(), GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), Ego::identifier, Ego::next, notify_listeners(), Ego::pk, and send_result_code().

710 {
711  struct GNUNET_SERVICE_Client *client = cls;
712  struct Ego *ego;
713  char *str;
714  char *fn;
715 
716  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received CREATE message from client\n");
717  str = GNUNET_strdup ((const char *) &crm[1]);
718  GNUNET_STRINGS_utf8_tolower ((const char *) &crm[1], str);
719  for (ego = ego_head; NULL != ego; ego = ego->next)
720  {
721  if (0 == strcmp (ego->identifier, str))
722  {
723  send_result_code (client,
724  1,
725  gettext_noop (
726  "identifier already in use for another ego"));
728  GNUNET_free (str);
729  return;
730  }
731  }
732  ego = GNUNET_new (struct Ego);
733  ego->pk = crm->private_key;
734  ego->identifier = GNUNET_strdup (str);
736  ego_tail,
737  ego);
738  send_result_code (client, 0, NULL);
739  fn = get_ego_filename (ego);
741  if (sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey) !=
743  &crm->private_key,
744  sizeof(struct GNUNET_CRYPTO_EcdsaPrivateKey),
748  GNUNET_free (fn);
749  GNUNET_free (str);
750  notify_listeners (ego);
752 }
struct Ego * next
We keep egos in a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
int GNUNET_DISK_directory_create_for_file(const char *filename)
Create the directory structure for storing a file.
Definition: disk.c:684
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Private ECC key encoded for transmission.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
ssize_t GNUNET_DISK_fn_write(const char *fn, const void *buffer, size_t n, enum GNUNET_DISK_AccessPermissions mode)
Write a buffer to a file.
Definition: disk.c:879
struct GNUNET_CRYPTO_EcdsaPrivateKey private_key
The private key.
Definition: identity.h:184
Handle to a client that is connected to a service.
Definition: service.c:250
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
static char * fn
Filename of the unique file.
char * identifier
String identifier for the ego.
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:567
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ handle_ego_rename()

static void handle_ego_rename ( void *  cls,
const char *  section 
)
static

An ego was renamed; rename it in all subsystems where it is currently set as the default.

Parameters
clsthe 'struct RenameContext'
sectiona section in the configuration to process

Definition at line 779 of file gnunet-service-identity.c.

References GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_OK, id, RenameContext::new_name, and RenameContext::old_name.

Referenced by handle_rename_message().

780 {
781  struct RenameContext *rc = cls;
782  char *id;
783 
785  section,
786  "DEFAULT_IDENTIFIER",
787  &id))
788  return;
789  if (0 != strcmp (id, rc->old_name))
790  {
791  GNUNET_free (id);
792  return;
793  }
795  section,
796  "DEFAULT_IDENTIFIER",
797  rc->new_name);
798  GNUNET_free (id);
799 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
Closure for &#39;handle_ego_rename&#39;.
static char * section
Name of the section.
Definition: gnunet-config.c:33
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
const char * new_name
New name.
const char * old_name
Old name.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_rename_message()

static int check_rename_message ( void *  cls,
const struct RenameMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_RENAME message.

Parameters
clsclient sending the message
msgmessage of type struct RenameMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 810 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, RenameMessage::header, RenameContext::new_name, RenameMessage::new_name_len, RenameContext::old_name, RenameMessage::old_name_len, size, and GNUNET_MessageHeader::size.

811 {
812  uint16_t size;
813  uint16_t old_name_len;
814  uint16_t new_name_len;
815  const char *old_name;
816  const char *new_name;
817 
818  size = ntohs (msg->header.size);
819  if (size <= sizeof(struct RenameMessage))
820  {
821  GNUNET_break (0);
822  return GNUNET_SYSERR;
823  }
824  old_name_len = ntohs (msg->old_name_len);
825  new_name_len = ntohs (msg->new_name_len);
826  old_name = (const char *) &msg[1];
827  new_name = &old_name[old_name_len];
828  if ((old_name_len + new_name_len + sizeof(struct RenameMessage) != size) ||
829  ('\0' != old_name[old_name_len - 1]) ||
830  ('\0' != new_name[new_name_len - 1]))
831  {
832  GNUNET_break (0);
833  return GNUNET_SYSERR;
834  }
835 
836  return GNUNET_OK;
837 }
uint16_t old_name_len
Number of characters in the old name including 0-termination, in NBO.
Definition: identity.h:204
Client requests renaming of an identity.
Definition: identity.h:194
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
const char * new_name
New name.
static unsigned int size
Size of the "table".
Definition: peer.c:67
uint16_t new_name_len
Number of characters in the new name including 0-termination, in NBO.
Definition: identity.h:209
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_RENAME.
Definition: identity.h:199
const char * old_name
Old name.

◆ handle_rename_message()

static void handle_rename_message ( void *  cls,
const struct RenameMessage rm 
)
static

Handler for RENAME message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 849 of file gnunet-service-identity.c.

References _, get_ego_filename(), gettext_noop, GNUNET_CONFIGURATION_iterate_sections(), GNUNET_CONFIGURATION_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), handle_ego_rename(), Ego::identifier, RenameContext::new_name, Ego::next, notify_listeners(), RenameContext::old_name, RenameMessage::old_name_len, send_result_code(), and subsystem_cfg_file.

850 {
851  uint16_t old_name_len;
852  struct Ego *ego;
853  char *old_name;
854  char *new_name;
855  struct RenameContext rename_ctx;
856  struct GNUNET_SERVICE_Client *client = cls;
857  char *fn_old;
858  char *fn_new;
859  const char *old_name_tmp;
860 
861  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received RENAME message from client\n");
862  old_name_len = ntohs (rm->old_name_len);
863  old_name_tmp = (const char *) &rm[1];
864  old_name = GNUNET_strdup (old_name_tmp);
865  GNUNET_STRINGS_utf8_tolower (old_name_tmp, old_name);
866  new_name = GNUNET_strdup (&old_name_tmp[old_name_len]);
867  GNUNET_STRINGS_utf8_tolower (&old_name_tmp[old_name_len], new_name);
868 
869  /* check if new name is already in use */
870  for (ego = ego_head; NULL != ego; ego = ego->next)
871  {
872  if (0 == strcmp (ego->identifier, new_name))
873  {
874  send_result_code (client, 1, gettext_noop ("target name already exists"));
876  GNUNET_free (old_name);
877  GNUNET_free (new_name);
878  return;
879  }
880  }
881 
882  /* locate old name and, if found, perform rename */
883  for (ego = ego_head; NULL != ego; ego = ego->next)
884  {
885  if (0 == strcmp (ego->identifier, old_name))
886  {
887  fn_old = get_ego_filename (ego);
888  GNUNET_free (ego->identifier);
889  rename_ctx.old_name = old_name;
890  rename_ctx.new_name = new_name;
893  &rename_ctx);
894  if (GNUNET_OK !=
896  GNUNET_log (
898  _ ("Failed to write subsystem default identifier map to `%s'.\n"),
900  ego->identifier = GNUNET_strdup (new_name);
901  fn_new = get_ego_filename (ego);
902  if (0 != rename (fn_old, fn_new))
904  GNUNET_free (fn_old);
905  GNUNET_free (fn_new);
906  GNUNET_free (old_name);
907  GNUNET_free (new_name);
908  notify_listeners (ego);
909  send_result_code (client, 0, NULL);
911  return;
912  }
913  }
914 
915  /* failed to locate old name */
916  send_result_code (client, 1, gettext_noop ("no matching ego found"));
917  GNUNET_free (old_name);
918  GNUNET_free (new_name);
920 }
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
uint16_t old_name_len
Number of characters in the old name including 0-termination, in NBO.
Definition: identity.h:204
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
Closure for &#39;handle_ego_rename&#39;.
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
Handle to a client that is connected to a service.
Definition: service.c:250
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
char * identifier
String identifier for the ego.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
void GNUNET_CONFIGURATION_iterate_sections(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Section_Iterator iter, void *iter_cls)
Iterate over all sections in the configuration.
#define GNUNET_log(kind,...)
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
static void handle_ego_rename(void *cls, const char *section)
An ego was renamed; rename it in all subsystems where it is currently set as the default.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:567
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ handle_ego_delete()

static void handle_ego_delete ( void *  cls,
const char *  section 
)
static

An ego was removed, remove it from all subsystems where it is currently set as the default.

Parameters
clsname of the removed ego (const char *)
sectiona section in the configuration to process

Definition at line 931 of file gnunet-service-identity.c.

References GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_free, GNUNET_OK, id, and Ego::identifier.

Referenced by handle_delete_message().

932 {
933  const char *identifier = cls;
934  char *id;
935 
937  section,
938  "DEFAULT_IDENTIFIER",
939  &id))
940  return;
941  if (0 != strcmp (id, identifier))
942  {
943  GNUNET_free (id);
944  return;
945  }
947  section,
948  "DEFAULT_IDENTIFIER",
949  NULL);
950  GNUNET_free (id);
951 }
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
static char * section
Name of the section.
Definition: gnunet-config.c:33
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
int GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_delete_message()

static int check_delete_message ( void *  cls,
const struct DeleteMessage msg 
)
static

Checks a GNUNET_MESSAGE_TYPE_IDENTITY_DELETE message.

Parameters
clsclient sending the message
msgmessage of type struct DeleteMessage
Returns
GNUNET_OK if msg is well-formed

Definition at line 962 of file gnunet-service-identity.c.

References GNUNET_break, GNUNET_OK, GNUNET_SYSERR, DeleteMessage::header, name, DeleteMessage::name_len, DeleteMessage::reserved, size, and GNUNET_MessageHeader::size.

963 {
964  uint16_t size;
965  uint16_t name_len;
966  const char *name;
967 
968  size = ntohs (msg->header.size);
969  if (size <= sizeof(struct DeleteMessage))
970  {
971  GNUNET_break (0);
972  return GNUNET_SYSERR;
973  }
974  name = (const char *) &msg[1];
975  name_len = ntohs (msg->name_len);
976  if ((name_len + sizeof(struct DeleteMessage) != size) ||
977  (0 != ntohs (msg->reserved)) || ('\0' != name[name_len - 1]))
978  {
979  GNUNET_break (0);
980  return GNUNET_SYSERR;
981  }
982  return GNUNET_OK;
983 }
uint16_t reserved
Always zero.
Definition: identity.h:235
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format...
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
struct GNUNET_MessageHeader header
Type: GNUNET_MESSAGE_TYPE_IDENTITY_DELETE.
Definition: identity.h:225
Client requests deletion of an identity.
Definition: identity.h:220
static unsigned int size
Size of the "table".
Definition: peer.c:67
const char * name
uint16_t name_len
Number of characters in the name including 0-termination, in NBO.
Definition: identity.h:230

◆ handle_delete_message()

static void handle_delete_message ( void *  cls,
const struct DeleteMessage dm 
)
static

Handler for DELETE message from client, creates new identity.

Parameters
clsunused
clientwho sent the message
messagethe message received

Definition at line 995 of file gnunet-service-identity.c.

References _, fn, get_ego_filename(), gettext_noop, GNUNET_CONFIGURATION_iterate_sections(), GNUNET_CONFIGURATION_write(), GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_log_strerror_file, GNUNET_OK, GNUNET_SERVICE_client_continue(), GNUNET_strdup, GNUNET_STRINGS_utf8_tolower(), handle_ego_delete(), Ego::identifier, name, Ego::next, notify_listeners(), send_result_code(), and subsystem_cfg_file.

996 {
997  struct Ego *ego;
998  char *name;
999  char *fn;
1000  struct GNUNET_SERVICE_Client *client = cls;
1001 
1002  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received DELETE message from client\n");
1003  name = GNUNET_strdup ((const char *) &dm[1]);
1004  GNUNET_STRINGS_utf8_tolower ((const char *) &dm[1], name);
1005 
1006  for (ego = ego_head; NULL != ego; ego = ego->next)
1007  {
1008  if (0 == strcmp (ego->identifier, name))
1009  {
1013  ego->identifier);
1014  if (GNUNET_OK !=
1016  GNUNET_log (
1018  _ ("Failed to write subsystem default identifier map to `%s'.\n"),
1020  fn = get_ego_filename (ego);
1021  if (0 != unlink (fn))
1023  GNUNET_free (fn);
1024  GNUNET_free (ego->identifier);
1025  ego->identifier = NULL;
1026  notify_listeners (ego);
1027  GNUNET_free (ego);
1028  GNUNET_free (name);
1029  send_result_code (client, 0, NULL);
1031  return;
1032  }
1033  }
1034 
1035  send_result_code (client, 1, gettext_noop ("no matching ego found"));
1036  GNUNET_free (name);
1038 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct Ego * next
We keep egos in a DLL.
int GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
static char * get_ego_filename(struct Ego *ego)
Get the name of the file we use to store a given ego.
static void send_result_code(struct GNUNET_SERVICE_Client *client, uint32_t result_code, const char *emsg)
Send a result code back to the client.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
Handle to a client that is connected to a service.
Definition: service.c:250
static void handle_ego_delete(void *cls, const char *section)
An ego was removed, remove it from all subsystems where it is currently set as the default...
#define GNUNET_log_strerror_file(level, cmd, filename)
Log an error message at log-level &#39;level&#39; that indicates a failure of the command &#39;cmd&#39; with the mess...
static char * fn
Filename of the unique file.
char * identifier
String identifier for the ego.
static struct Ego * ego_head
Head of DLL of all egos.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
Information we keep about each ego.
static void notify_listeners(struct Ego *ego)
Send an updated message for the given ego to all listeners.
const char * name
void GNUNET_CONFIGURATION_iterate_sections(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_CONFIGURATION_Section_Iterator iter, void *iter_cls)
Iterate over all sections in the configuration.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2242
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_STRINGS_utf8_tolower(const char *input, char *output)
Convert the utf-8 input string to lower case.
Definition: strings.c:567
#define gettext_noop(String)
Definition: gettext.h:69
Here is the call graph for this function:

◆ process_ego_file()

static int process_ego_file ( void *  cls,
const char *  filename 
)
static

Process the given file from the "EGODIR".

Parses the file and creates the respective 'struct Ego' in memory.

Parameters
clsNULL
filenamename of the file to parse
Returns
GNUNET_OK to continue to iterate, GNUNET_NO to stop iteration with no error, GNUNET_SYSERR to abort iteration with error!

Definition at line 1052 of file gnunet-service-identity.c.

References _, DIR_SEPARATOR, fn, GNUNET_break, GNUNET_CONTAINER_DLL_insert, GNUNET_CRYPTO_ecdsa_key_from_file(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_strdup, Ego::identifier, and Ego::pk.

Referenced by run().

1054 {
1055  struct Ego *ego;
1056  const char *fn;
1057 
1058  fn = strrchr (filename, (int) DIR_SEPARATOR);
1059  if (NULL == fn)
1060  {
1061  GNUNET_break (0);
1062  return GNUNET_OK;
1063  }
1064  ego = GNUNET_new (struct Ego);
1065  if (GNUNET_OK !=
1067  GNUNET_NO,
1068  &ego->pk))
1069  {
1070  GNUNET_free (ego);
1072  _ ("Failed to parse ego information in `%s'\n"),
1073  filename);
1074  return GNUNET_OK;
1075  }
1077  "Loaded ego `%s'\n",
1078  fn + 1);
1079  ego->identifier = GNUNET_strdup (fn + 1);
1081  return GNUNET_OK;
1082 }
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
int GNUNET_CRYPTO_ecdsa_key_from_file(const char *filename, int do_create, struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey)
Create a new private key by reading it from a file.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
static char * fn
Filename of the unique file.
static char * filename
char * identifier
String identifier for the ego.
#define DIR_SEPARATOR
Definition: platform.h:170
static struct Ego * ego_head
Head of DLL of all egos.
Information we keep about each ego.
struct GNUNET_CRYPTO_EcdsaPrivateKey pk
Private key of the ego.
#define GNUNET_log(kind,...)
static struct Ego * ego_tail
Tail of DLL of all egos.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle service 
)
static

Handle network size estimate clients.

Parameters
clsclosure
serverthe initialized server
cconfiguration to use

Definition at line 1093 of file gnunet-service-identity.c.

References _, client_connect_cb(), client_disconnect_cb(), ego_directory, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_get_value_filename(), GNUNET_CONFIGURATION_parse(), GNUNET_DISK_directory_create(), GNUNET_DISK_directory_scan(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_log_config_missing(), GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, GNUNET_MESSAGE_TYPE_IDENTITY_START, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_notification_context_create(), GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_SERVICE_MAIN(), GNUNET_SERVICE_OPTION_NONE, GNUNET_STATISTICS_create(), GNUNET_YES, process_ego_file(), shutdown_task(), and subsystem_cfg_file.

1096 {
1097  cfg = c;
1100  "identity",
1101  "EGODIR",
1102  &ego_directory))
1103  {
1104  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "identity", "EGODIR");
1106  return;
1107  }
1108  if (GNUNET_OK !=
1110  "identity",
1111  "SUBSYSTEM_CFG",
1113  {
1115  "identity",
1116  "SUBSYSTEM_CFG");
1118  return;
1119  }
1121  "Loading subsystem configuration `%s'\n",
1125  (GNUNET_OK !=
1127  {
1129  _ (
1130  "Failed to parse subsystem identity configuration file `%s'\n"),
1133  return;
1134  }
1135  stats = GNUNET_STATISTICS_create ("identity", cfg);
1137  {
1139  _ ("Failed to create directory `%s' for storing egos\n"),
1140  ego_directory);
1141  }
1144  NULL);
1146 }
int 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:544
int GNUNET_DISK_directory_create(const char *dir)
Implementation of "mkdir -p".
Definition: disk.c:589
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:1331
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
int GNUNET_CONFIGURATION_parse(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Parse a configuration file, add all of the options in the file to the configuration environment...
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:911
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:531
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
static const struct GNUNET_CONFIGURATION_Handle * cfg
Handle to our current configuration.
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
static struct GNUNET_STATISTICS_Handle * stats
Handle to the statistics service.
static void shutdown_task(void *cls)
Task run during shutdown.
static struct GNUNET_NotificationContext * nc
Notification context, simplifies client broadcasts.
static char * subsystem_cfg_file
Configuration file name where subsystem information is kept.
struct GNUNET_NotificationContext * GNUNET_notification_context_create(unsigned int queue_length)
Create a new notification context.
Definition: nc.c:121
#define GNUNET_log(kind,...)
int GNUNET_CONFIGURATION_get_value_filename(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be the name of a file or directory.
static char * ego_directory
Directory where we store the identities.
static int process_ego_file(void *cls, const char *filename)
Process the given file from the "EGODIR".
static struct GNUNET_CONFIGURATION_Handle * subsystem_cfg
Handle to subsystem configuration which for each subsystem contains the name of the default ego...
Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( "identity"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_fixed_size(start_message, GNUNET_MESSAGE_TYPE_IDENTITY_START, struct GNUNET_MessageHeader, NULL)  ,
GNUNET_MQ_hd_var_size(lookup_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP, struct LookupMessage, NULL)  ,
GNUNET_MQ_hd_var_size(lookup_by_suffix_message, GNUNET_MESSAGE_TYPE_IDENTITY_LOOKUP_BY_SUFFIX, struct LookupMessage, NULL)  ,
GNUNET_MQ_hd_var_size(get_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_GET_DEFAULT, struct GetDefaultMessage, NULL)  ,
GNUNET_MQ_hd_var_size(set_default_message, GNUNET_MESSAGE_TYPE_IDENTITY_SET_DEFAULT, struct SetDefaultMessage, NULL)  ,
GNUNET_MQ_hd_var_size(create_message, GNUNET_MESSAGE_TYPE_IDENTITY_CREATE, struct CreateRequestMessage, NULL)  ,
GNUNET_MQ_hd_var_size(rename_message, GNUNET_MESSAGE_TYPE_IDENTITY_RENAME, struct RenameMessage, NULL)  ,
GNUNET_MQ_hd_var_size(delete_message, GNUNET_MESSAGE_TYPE_IDENTITY_DELETE, struct DeleteMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Referenced by run().

Here is the caller graph for this function:

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Handle to our current configuration.

Definition at line 72 of file gnunet-service-identity.c.

◆ subsystem_cfg

struct GNUNET_CONFIGURATION_Handle* subsystem_cfg
static

Handle to subsystem configuration which for each subsystem contains the name of the default ego.

Definition at line 78 of file gnunet-service-identity.c.

◆ stats

struct GNUNET_STATISTICS_Handle* stats
static

Handle to the statistics service.

Definition at line 83 of file gnunet-service-identity.c.

◆ nc

struct GNUNET_NotificationContext* nc
static

Notification context, simplifies client broadcasts.

Definition at line 88 of file gnunet-service-identity.c.

◆ ego_directory

char* ego_directory
static

Directory where we store the identities.

Definition at line 93 of file gnunet-service-identity.c.

Referenced by get_ego_filename(), run(), and shutdown_task().

◆ subsystem_cfg_file

char* subsystem_cfg_file
static

Configuration file name where subsystem information is kept.

Definition at line 98 of file gnunet-service-identity.c.

Referenced by handle_delete_message(), handle_rename_message(), handle_set_default_message(), run(), and shutdown_task().

◆ ego_head

struct Ego* ego_head
static

Head of DLL of all egos.

Definition at line 103 of file gnunet-service-identity.c.

◆ ego_tail

struct Ego* ego_tail
static

Tail of DLL of all egos.

Definition at line 108 of file gnunet-service-identity.c.