GNUnet  0.20.0
gnunet-daemon-regexprofiler.c File Reference

daemon that uses cadet to announce a regular expression. More...

Include dependency graph for gnunet-daemon-regexprofiler.c:

Go to the source code of this file.

Functions

static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void reannounce_regex (void *cls)
 Announce a previously announced regex re-using cached data. More...
 
static void announce_regex (const char *regex)
 Announce the given regular expression using regex and the path compression length read from config. More...
 
static int scan (void *cls, const char *filename)
 Scan through the policy_dir looking for the n-th filename. 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 of the regexprofiler service. More...
 

Variables

static int global_ret
 Return value from 'main'. More...
 
static const struct GNUNET_CONFIGURATION_Handlecfg
 Configuration we use. More...
 
static struct GNUNET_STATISTICS_Handlestats_handle
 Handle to the statistics service. More...
 
static struct GNUNET_DHT_Handledht_handle
 Peer's dht handle. More...
 
static struct REGEX_INTERNAL_Announcementannounce_handle
 Peer's regex announce handle. More...
 
static struct GNUNET_SCHEDULER_Taskreannounce_task
 Periodically reannounce regex. More...
 
static struct GNUNET_TIME_Relative reannounce_period_max
 What's the maximum reannounce period. More...
 
static unsigned long long max_path_compression
 Maximal path compression length for regex announcing. More...
 
static char * policy_filename
 Name of the file containing policies that this peer should announce. More...
 
static char * regex_prefix
 Prefix to add before every regex we're announcing. More...
 
static char * rx_with_pfx
 Regex with prefix. More...
 
static unsigned int rounds = 3
 How many put rounds should we do. More...
 
static struct GNUNET_CRYPTO_EddsaPrivateKeymy_private_key
 Private key for this peer. More...
 

Detailed Description

daemon that uses cadet to announce a regular expression.

Used in conjunction with gnunet-regex-profiler to announce regexes on several peers without the need to explicitly connect to the cadet service running on the peer from within the profiler.

Author
Maximilian Szengel
Bartlomiej Polot

Definition in file gnunet-daemon-regexprofiler.c.

Function Documentation

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused

Definition at line 110 of file gnunet-daemon-regexprofiler.c.

111 {
112  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shutting down\n");
113 
114  if (NULL != announce_handle)
115  {
117  announce_handle = NULL;
118  }
119  if (NULL != reannounce_task)
120  {
122  reannounce_task = NULL;
123  }
124  if (NULL != dht_handle)
125  {
127  dht_handle = NULL;
128  }
130  my_private_key = NULL;
131 
133  "Daemon for %s shutting down\n",
135 }
static struct REGEX_INTERNAL_Announcement * announce_handle
Peer's regex announce handle.
static struct GNUNET_DHT_Handle * dht_handle
Peer's dht handle.
static char * policy_filename
Name of the file containing policies that this peer should announce.
static struct GNUNET_CRYPTO_EddsaPrivateKey * my_private_key
Private key for this peer.
static struct GNUNET_SCHEDULER_Task * reannounce_task
Periodically reannounce regex.
void GNUNET_DHT_disconnect(struct GNUNET_DHT_Handle *handle)
Shutdown connection with the DHT service.
Definition: dht_api.c:1062
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_free(ptr)
Wrapper around free.
#define GNUNET_free_nz(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:975
void REGEX_INTERNAL_announce_cancel(struct REGEX_INTERNAL_Announcement *h)
Clear all cached data used by a regex announce.

References announce_handle, dht_handle, GNUNET_DHT_disconnect(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_INFO, GNUNET_free, GNUNET_free_nz, GNUNET_log, GNUNET_SCHEDULER_cancel(), my_private_key, policy_filename, reannounce_task, and REGEX_INTERNAL_announce_cancel().

Referenced by run().

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

◆ reannounce_regex()

static void reannounce_regex ( void *  cls)
static

Announce a previously announced regex re-using cached data.

Parameters
clsClosure (regex to announce if needed).

Definition at line 144 of file gnunet-daemon-regexprofiler.c.

145 {
146  char *regex = cls;
147  struct GNUNET_TIME_Relative random_delay;
148 
149  reannounce_task = NULL;
150  if (0 == rounds--)
151  {
152  global_ret = 0;
154  GNUNET_free (regex);
155  return;
156  }
157  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Announcing regex: %s\n", regex);
158  GNUNET_STATISTICS_update (stats_handle, "# regexes announced", 1, GNUNET_NO);
159  if ((NULL == announce_handle) && (NULL != regex))
160  {
162  "First time, creating regex: %s\n",
163  regex);
166  regex,
167  (unsigned
169  stats_handle);
170  }
171  else
172  {
173  GNUNET_assert (NULL != announce_handle);
175  }
176 
177  random_delay =
183  &reannounce_regex, cls);
184 }
static void reannounce_regex(void *cls)
Announce a previously announced regex re-using cached data.
static int global_ret
Return value from 'main'.
static struct GNUNET_TIME_Relative reannounce_period_max
What's the maximum reannounce period.
static struct GNUNET_STATISTICS_Handle * stats_handle
Handle to the statistics service.
static unsigned int rounds
How many put rounds should we do.
static unsigned long long max_path_compression
Maximal path compression length for regex announcing.
uint32_t GNUNET_CRYPTO_random_u32(enum GNUNET_CRYPTO_Quality mode, uint32_t i)
Produce a random value.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
@ GNUNET_NO
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:562
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:1272
void GNUNET_STATISTICS_update(struct GNUNET_STATISTICS_Handle *handle, const char *name, int64_t delta, int make_persistent)
Set statistic value for the peer.
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:484
#define GNUNET_TIME_UNIT_MICROSECONDS
One microsecond, our basic time unit.
void REGEX_INTERNAL_reannounce(struct REGEX_INTERNAL_Announcement *h)
Announce again a regular expression previously announced.
struct REGEX_INTERNAL_Announcement * REGEX_INTERNAL_announce(struct GNUNET_DHT_Handle *dht, const struct GNUNET_CRYPTO_EddsaPrivateKey *priv, const char *regex, uint16_t compression, struct GNUNET_STATISTICS_Handle *stats)
Announce a regular expression: put all states of the automaton in the DHT.
Time for relative time used by GNUnet, in microseconds.
uint64_t rel_value_us
The actual value.

References announce_handle, dht_handle, global_ret, GNUNET_assert, GNUNET_CRYPTO_QUALITY_WEAK, GNUNET_CRYPTO_random_u32(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_SCHEDULER_add_delayed(), GNUNET_SCHEDULER_shutdown(), GNUNET_STATISTICS_update(), GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_MICROSECONDS, max_path_compression, my_private_key, reannounce_period_max, reannounce_task, REGEX_INTERNAL_announce(), REGEX_INTERNAL_reannounce(), GNUNET_TIME_Relative::rel_value_us, rounds, and stats_handle.

Referenced by announce_regex().

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

◆ announce_regex()

static void announce_regex ( const char *  regex)
static

Announce the given regular expression using regex and the path compression length read from config.

Parameters
regexregular expression to announce on this peer's cadet.

Definition at line 194 of file gnunet-daemon-regexprofiler.c.

195 {
196  char *copy;
197 
198  if ((NULL == regex) || (0 == strlen (regex)))
199  {
200  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Cannot announce empty regex\n");
201  return;
202  }
203 
205  "Daemon for %s starting\n",
207  GNUNET_assert (NULL == reannounce_task);
208  copy = GNUNET_strdup (regex);
210  (void *) copy);
211 }
@ GNUNET_ERROR_TYPE_ERROR
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
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:1299

References GNUNET_assert, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_INFO, GNUNET_log, GNUNET_SCHEDULER_add_now(), GNUNET_strdup, policy_filename, reannounce_regex(), and reannounce_task.

Referenced by run().

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

◆ scan()

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

Scan through the policy_dir looking for the n-th filename.

Parameters
clsClosure (target number n).
filenamecomplete filename (absolute path).
Returns
GNUNET_OK to continue to iterate, GNUNET_NO to stop when found

Definition at line 223 of file gnunet-daemon-regexprofiler.c.

224 {
225  long n = (long) cls;
226  static long c = 0;
227 
228  if (c == n)
229  {
231  return GNUNET_NO;
232  }
233  c++;
234  return GNUNET_OK;
235 }
static char * filename
@ GNUNET_OK

References filename, GNUNET_NO, GNUNET_OK, GNUNET_strdup, and policy_filename.

Referenced by run().

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!)
cfg_configuration

Definition at line 247 of file gnunet-daemon-regexprofiler.c.

250 {
251  char *regex = NULL;
252  char **components;
253  char *policy_dir;
254  long long unsigned int peer_id;
255 
256  cfg = cfg_;
257 
259  GNUNET_assert (NULL != my_private_key);
260  if (GNUNET_OK !=
261  GNUNET_CONFIGURATION_get_value_number (cfg, "REGEXPROFILER",
262  "MAX_PATH_COMPRESSION",
264  {
266  _
267  (
268  "%s service is lacking key configuration settings (%s). Exiting.\n"),
269  "regexprofiler", "max_path_compression");
272  return;
273  }
274  if (GNUNET_OK !=
275  GNUNET_CONFIGURATION_get_value_string (cfg, "REGEXPROFILER",
276  "POLICY_DIR", &policy_dir))
277  {
279  "POLICY_DIR");
282  return;
283  }
284  if (GNUNET_OK !=
286  "PEERID", &peer_id))
287  {
288  GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR, "TESTBED", "PEERID");
292  return;
293  }
294 
295  if (GNUNET_OK !=
296  GNUNET_CONFIGURATION_get_value_string (cfg, "REGEXPROFILER",
297  "REGEX_PREFIX", &regex_prefix))
298  {
300  "REGEX_PREFIX");
304  return;
305  }
306 
307  if (GNUNET_OK !=
308  GNUNET_CONFIGURATION_get_value_time (cfg, "REGEXPROFILER",
309  "REANNOUNCE_PERIOD_MAX",
311  {
313  "reannounce_period_max not given. Using 10 minutes.\n");
316  }
317 
318  stats_handle = GNUNET_STATISTICS_create ("regexprofiler", cfg);
319 
321 
322  if (NULL == dht_handle)
323  {
325  "Could not acquire dht handle. Exiting.\n");
329  return;
330  }
331 
332  /* Read regexes from policy files */
334  (void *) (long) peer_id));
335  if (NULL == (components = REGEX_TEST_read_from_file (policy_filename)))
336  {
338  "Policy file %s contains no policies. Exiting.\n",
343  return;
344  }
346  regex = REGEX_TEST_combine (components, 16);
347  REGEX_TEST_free_from_file (components);
348 
349  /* Announcing regexes from policy_filename */
351  "%s(%s)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*",
352  regex_prefix,
353  regex);
355  GNUNET_free (regex);
357 
358  /* Scheduled the task to clean up when shutdown is called */
360  NULL);
361 }
static char * peer_id
Option –peer.
Definition: gnunet-cadet.c:42
static char * rx_with_pfx
Regex with prefix.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we use.
static void shutdown_task(void *cls)
Task run during shutdown.
static void announce_regex(const char *regex)
Announce the given regular expression using regex and the path compression length read from config.
static int scan(void *cls, const char *filename)
Scan through the policy_dir looking for the n-th filename.
static char * regex_prefix
Prefix to add before every regex we're announcing.
static char * policy_dir
Folder where policy files are stored.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
enum GNUNET_GenericReturnValue 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_CRYPTO_EddsaPrivateKey * GNUNET_CRYPTO_eddsa_key_create_from_configuration(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a new private key by reading our peer's key from the file specified in the configuration.
struct GNUNET_DHT_Handle * GNUNET_DHT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, unsigned int ht_len)
Initialize the connection with the DHT service.
Definition: dht_api.c:1039
int GNUNET_DISK_directory_scan(const char *dir_name, GNUNET_FileNameCallback callback, void *callback_cls)
Scan a directory for files.
Definition: disk.c:814
@ GNUNET_SYSERR
void GNUNET_log_config_missing(enum GNUNET_ErrorType kind, const char *section, const char *option)
Log error message about missing configuration option.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
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,...
Definition: scheduler.c:1334
struct GNUNET_STATISTICS_Handle * GNUNET_STATISTICS_create(const char *subsystem, const struct GNUNET_CONFIGURATION_Handle *cfg)
Get handle for the statistics service.
#define GNUNET_TIME_UNIT_MINUTES
One minute.
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
char * REGEX_TEST_combine(char *const regexes[], unsigned int alphabet_size)
Combine an array of regexes into a single prefix-shared regex.
void REGEX_TEST_free_from_file(char **regexes)
Free all memory reserved for a set of regexes created by read_from_file.
char ** REGEX_TEST_read_from_file(const char *filename)
Read a set of regexes from a file, one per line and return them in an array suitable for REGEX_TEST_c...

References _, announce_regex(), cfg, dht_handle, global_ret, GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_get_value_time(), GNUNET_CRYPTO_eddsa_key_create_from_configuration(), GNUNET_DHT_connect(), GNUNET_DISK_directory_scan(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_log_config_missing(), GNUNET_OK, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), GNUNET_STATISTICS_create(), GNUNET_SYSERR, GNUNET_TIME_relative_multiply(), GNUNET_TIME_UNIT_MINUTES, max_path_compression, my_private_key, peer_id, policy_dir, policy_filename, reannounce_period_max, regex_prefix, REGEX_TEST_combine(), REGEX_TEST_free_from_file(), REGEX_TEST_read_from_file(), rx_with_pfx, scan(), shutdown_task(), and stats_handle.

Referenced by main().

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 of the regexprofiler service.

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

Definition at line 372 of file gnunet-daemon-regexprofiler.c.

373 {
374  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
376  };
377 
378  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
379  return 2;
380  return (GNUNET_OK ==
381  GNUNET_PROGRAM_run (argc, argv, "regexprofiler",
383  (
384  "Daemon to announce regular expressions for the peer using cadet."),
385  options, &run, NULL)) ? global_ret : 1;
386 }
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
#define gettext_noop(String)
Definition: gettext.h:70
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.
enum GNUNET_GenericReturnValue 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,...
Definition: program.c:400
enum GNUNET_GenericReturnValue GNUNET_STRINGS_get_utf8_args(int argc, char *const *argv, int *u8argc, char *const **u8argv)
Returns utf-8 encoded arguments.
Definition: strings.c:1222
Definition of a command line option.

References gettext_noop, global_ret, GNUNET_GETOPT_OPTION_END, GNUNET_OK, GNUNET_PROGRAM_run(), GNUNET_STRINGS_get_utf8_args(), options, and run().

Here is the call graph for this function:

Variable Documentation

◆ global_ret

int global_ret
static

Return value from 'main'.

Definition at line 40 of file gnunet-daemon-regexprofiler.c.

Referenced by main(), reannounce_regex(), and run().

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

Configuration we use.

Definition at line 45 of file gnunet-daemon-regexprofiler.c.

Referenced by run().

◆ stats_handle

struct GNUNET_STATISTICS_Handle* stats_handle
static

Handle to the statistics service.

Definition at line 50 of file gnunet-daemon-regexprofiler.c.

Referenced by reannounce_regex(), and run().

◆ dht_handle

struct GNUNET_DHT_Handle* dht_handle
static

Peer's dht handle.

Definition at line 55 of file gnunet-daemon-regexprofiler.c.

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

◆ announce_handle

struct REGEX_INTERNAL_Announcement* announce_handle
static

Peer's regex announce handle.

Definition at line 60 of file gnunet-daemon-regexprofiler.c.

Referenced by reannounce_regex(), and shutdown_task().

◆ reannounce_task

struct GNUNET_SCHEDULER_Task* reannounce_task
static

Periodically reannounce regex.

Definition at line 65 of file gnunet-daemon-regexprofiler.c.

Referenced by announce_regex(), reannounce_regex(), and shutdown_task().

◆ reannounce_period_max

struct GNUNET_TIME_Relative reannounce_period_max
static

What's the maximum reannounce period.

Definition at line 65 of file gnunet-daemon-regexprofiler.c.

Referenced by reannounce_regex(), and run().

◆ max_path_compression

unsigned long long max_path_compression
static

Maximal path compression length for regex announcing.

Definition at line 75 of file gnunet-daemon-regexprofiler.c.

Referenced by reannounce_regex(), and run().

◆ policy_filename

char* policy_filename
static

Name of the file containing policies that this peer should announce.

One policy per line.

Definition at line 81 of file gnunet-daemon-regexprofiler.c.

Referenced by announce_regex(), run(), scan(), and shutdown_task().

◆ regex_prefix

char* regex_prefix
static

Prefix to add before every regex we're announcing.

Definition at line 86 of file gnunet-daemon-regexprofiler.c.

Referenced by run().

◆ rx_with_pfx

char* rx_with_pfx
static

Regex with prefix.

Definition at line 91 of file gnunet-daemon-regexprofiler.c.

Referenced by run().

◆ rounds

unsigned int rounds = 3
static

How many put rounds should we do.

Definition at line 96 of file gnunet-daemon-regexprofiler.c.

Referenced by reannounce_regex().

◆ my_private_key

struct GNUNET_CRYPTO_EddsaPrivateKey* my_private_key
static

Private key for this peer.

Definition at line 101 of file gnunet-daemon-regexprofiler.c.

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