GNUnet 0.21.1
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:1060
#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:981
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
170 }
171 else
172 {
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:567
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:1278
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_regex(), reannounce_task, REGEX_INTERNAL_announce(), REGEX_INTERNAL_reannounce(), GNUNET_TIME_Relative::rel_value_us, rounds, and stats_handle.

Referenced by announce_regex(), and reannounce_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",
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:1305

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
260 if (GNUNET_OK !=
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 !=
276 "POLICY_DIR", &policy_dir))
277 {
279 "POLICY_DIR");
282 return;
283 }
284 if (GNUNET_OK !=
286 "PEERID", &peer_id))
287 {
292 return;
293 }
294
295 if (GNUNET_OK !=
297 "REGEX_PREFIX", &regex_prefix))
298 {
300 "REGEX_PREFIX");
304 return;
305 }
306
307 if (GNUNET_OK !=
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)*",
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:1037
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:1340
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
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_combine(char *const regexes[], unsigned int alphabet_size)
Combine an array of regexes into a single prefix-shared regex.
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:1230
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 70 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().