GNUnet 0.21.1
gnunet-service-messenger_operation.c File Reference
Include dependency graph for gnunet-service-messenger_operation.c:

Go to the source code of this file.

Functions

struct GNUNET_MESSENGER_Operationcreate_operation (const struct GNUNET_HashCode *hash)
 Creates and allocates a new operation under a given hash. More...
 
void destroy_operation (struct GNUNET_MESSENGER_Operation *op)
 Destroys an operation and frees its memory fully. More...
 
static void callback_operation (void *cls)
 
struct GNUNET_MESSENGER_Operationload_operation (struct GNUNET_MESSENGER_OperationStore *store, const char *path)
 Loads data from a configuration file at a selected path into a new allocated and created operation for a specific operation store if the required information could be read successfully. More...
 
void save_operation (const struct GNUNET_MESSENGER_Operation *op, const char *path)
 Saves data from an operation into a configuration file at a selected path which can be load to restore the operation completely and continue its process. More...
 
void callback_store_operation (struct GNUNET_MESSENGER_OperationStore *store, enum GNUNET_MESSENGER_OperationType type, const struct GNUNET_HashCode *hash)
 
enum GNUNET_GenericReturnValue start_operation (struct GNUNET_MESSENGER_Operation *op, enum GNUNET_MESSENGER_OperationType type, struct GNUNET_MESSENGER_OperationStore *store, struct GNUNET_TIME_Relative delay)
 Starts an inactive operation with a given delay in a specific operation store. More...
 
enum GNUNET_GenericReturnValue stop_operation (struct GNUNET_MESSENGER_Operation *op)
 Stops an active operation and resets its type to be GNUNET_MESSENGER_OP_UNKNOWN. More...
 

Function Documentation

◆ create_operation()

struct GNUNET_MESSENGER_Operation * create_operation ( const struct GNUNET_HashCode hash)

Creates and allocates a new operation under a given hash.

Parameters
[in]hashHash of message

Definition at line 31 of file gnunet-service-messenger_operation.c.

32{
33 GNUNET_assert (hash);
34
37
39 GNUNET_memcpy (&(op->hash), hash, sizeof(*hash));
40 op->timestamp = GNUNET_TIME_absolute_get_zero_ ();
41 op->store = NULL;
42 op->task = NULL;
43
44 return op;
45}
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:144
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get_zero_(void)
Return absolute time of 0ms.
Definition: time.c:142

References GNUNET_assert, GNUNET_memcpy, GNUNET_MESSENGER_OP_UNKNOWN, GNUNET_new, GNUNET_TIME_absolute_get_zero_(), GNUNET_MESSENGER_Operation::hash, and op.

Referenced by load_operation(), and use_store_operation().

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

◆ destroy_operation()

void destroy_operation ( struct GNUNET_MESSENGER_Operation op)

Destroys an operation and frees its memory fully.

Parameters
[in,out]opOperation

Definition at line 49 of file gnunet-service-messenger_operation.c.

50{
52
53 if (op->task)
55
57}
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:975

References GNUNET_assert, GNUNET_free, GNUNET_SCHEDULER_cancel(), and op.

Referenced by callback_scan_for_operations(), cancel_store_operation(), iterate_destroy_operations(), load_operation(), and use_store_operation().

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

◆ callback_operation()

static void callback_operation ( void *  cls)
static

Definition at line 181 of file gnunet-service-messenger_operation.c.

182{
183 struct GNUNET_MESSENGER_Operation *op = cls;
184
185 op->task = NULL;
186
187 callback_store_operation (op->store, op->type, &(op->hash));
188}
void callback_store_operation(struct GNUNET_MESSENGER_OperationStore *store, enum GNUNET_MESSENGER_OperationType type, const struct GNUNET_HashCode *hash)

References callback_store_operation(), and op.

Referenced by load_operation(), and start_operation().

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

◆ load_operation()

struct GNUNET_MESSENGER_Operation * load_operation ( struct GNUNET_MESSENGER_OperationStore store,
const char *  path 
)

Loads data from a configuration file at a selected path into a new allocated and created operation for a specific operation store if the required information could be read successfully.

The method will return the new operation and it will be started automatically to match its timestamp of execution.

If the method fails to restore any valid operation from the file, NULL gets returned instead.

Parameters
[in,out]storeOperation store
[in]pathPath of a configuration file

Definition at line 64 of file gnunet-service-messenger_operation.c.

66{
67 GNUNET_assert ((store) && (path));
68
69 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Load operation configuration: %s\n",
70 path);
71
73 struct GNUNET_MESSENGER_Operation *op = NULL;
74
76 goto destroy_config;
77
78 struct GNUNET_HashCode hash;
79
80 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "operation", "hash",
81 &hash, sizeof(hash)))
82 goto destroy_config;
83
84 op = create_operation (&hash);
85
86 unsigned long long type_number;
88 "type", &type_number))
89 switch (type_number)
90 {
93 break;
96 break;
99 break;
100 default:
101 break;
102 }
103
104 if ((GNUNET_MESSENGER_OP_UNKNOWN == op->type) ||
106 "timestamp",
107 &(op->timestamp),
108 sizeof(op->timestamp))))
109 {
111 op = NULL;
112 goto destroy_config;
113 }
114
116 op->timestamp);
117
119 delay,
122 op
123 );
124
125 op->store = store;
126
127destroy_config:
129
130 return op;
131}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:109
struct GNUNET_MESSENGER_Operation * create_operation(const struct GNUNET_HashCode *hash)
Creates and allocates a new operation under a given hash.
static void callback_operation(void *cls)
void destroy_operation(struct GNUNET_MESSENGER_Operation *op)
Destroys an operation and frees its memory fully.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_data(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, void *buf, size_t buf_size)
Get Crockford32-encoded fixed-size binary data from a configuration.
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.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
enum GNUNET_GenericReturnValue 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.
#define GNUNET_log(kind,...)
@ GNUNET_SCHEDULER_PRIORITY_BACKGROUND
Run as background job (higher than idle, lower than default).
@ GNUNET_OK
@ GNUNET_ERROR_TYPE_DEBUG
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_delayed_with_priority(struct GNUNET_TIME_Relative delay, enum GNUNET_SCHEDULER_Priority priority, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay.
Definition: scheduler.c:1202
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:405
A 512-bit hashcode.
Time for relative time used by GNUnet, in microseconds.

References callback_operation(), cfg, create_operation(), destroy_operation(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_data(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_parse(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSENGER_OP_DELETE, GNUNET_MESSENGER_OP_MERGE, GNUNET_MESSENGER_OP_REQUEST, GNUNET_MESSENGER_OP_UNKNOWN, GNUNET_OK, GNUNET_SCHEDULER_add_delayed_with_priority(), GNUNET_SCHEDULER_PRIORITY_BACKGROUND, GNUNET_TIME_absolute_get_remaining(), op, and GNUNET_MESSENGER_Operation::store.

Referenced by callback_scan_for_operations().

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

◆ save_operation()

void save_operation ( const struct GNUNET_MESSENGER_Operation op,
const char *  path 
)

Saves data from an operation into a configuration file at a selected path which can be load to restore the operation completely and continue its process.

Parameters
[in]opOperation
[in]pathPath of a configuration file

Definition at line 135 of file gnunet-service-messenger_operation.c.

137{
138 GNUNET_assert ((path) && (op));
139
140 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Save operation configuration: %s\n",
141 path);
142
144
145 char *hash_data;
146 hash_data = GNUNET_STRINGS_data_to_string_alloc (&(op->hash),
147 sizeof(op->hash));
148
149 if (hash_data)
150 {
151 GNUNET_CONFIGURATION_set_value_string (cfg, "operation", "hash", hash_data);
152
153 GNUNET_free (hash_data);
154 }
155
156 GNUNET_CONFIGURATION_set_value_number (cfg, "operation", "type", op->type);
157
158 char *timestamp_data;
159 timestamp_data = GNUNET_STRINGS_data_to_string_alloc (&(op->timestamp),
160 sizeof(op->timestamp));
161
162 if (timestamp_data)
163 {
164 GNUNET_CONFIGURATION_set_value_string (cfg, "operation", "timestamp",
165 timestamp_data);
166
167 GNUNET_free (timestamp_data);
168 }
169
172}
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.
void GNUNET_CONFIGURATION_set_value_number(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long number)
Set a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition: strings.c:764

References cfg, GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_set_value_number(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_STRINGS_data_to_string_alloc(), and op.

Referenced by iterate_save_operations().

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

◆ callback_store_operation()

void callback_store_operation ( struct GNUNET_MESSENGER_OperationStore store,
enum GNUNET_MESSENGER_OperationType  type,
const struct GNUNET_HashCode hash 
)

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

246{
247 GNUNET_assert ((store) && (hash));
248
249 struct GNUNET_HashCode op_hash;
250 GNUNET_memcpy (&op_hash, hash, sizeof(op_hash));
251 cancel_store_operation (store, &op_hash);
252
253 struct GNUNET_MESSENGER_SrvRoom *room = store->room;
254
255 switch (type)
256 {
258 break;
260 callback_room_deletion (room, &op_hash);
261 break;
263 callback_room_merge (room, &op_hash);
264 break;
265 default:
266 break;
267 }
268}
static uint32_t type
Type string converted to DNS type value.
void cancel_store_operation(struct GNUNET_MESSENGER_OperationStore *store, const struct GNUNET_HashCode *hash)
Stops any active operation under a given hash in a specific operation store.
void callback_room_deletion(struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *hash)
void callback_room_merge(struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *hash)

References callback_room_deletion(), callback_room_merge(), cancel_store_operation(), GNUNET_assert, GNUNET_memcpy, GNUNET_MESSENGER_OP_DELETE, GNUNET_MESSENGER_OP_MERGE, GNUNET_MESSENGER_OP_REQUEST, GNUNET_MESSENGER_Operation::hash, GNUNET_MESSENGER_OperationStore::room, GNUNET_MESSENGER_Operation::store, and type.

Referenced by callback_operation().

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

◆ start_operation()

enum GNUNET_GenericReturnValue start_operation ( struct GNUNET_MESSENGER_Operation op,
enum GNUNET_MESSENGER_OperationType  type,
struct GNUNET_MESSENGER_OperationStore store,
struct GNUNET_TIME_Relative  delay 
)

Starts an inactive operation with a given delay in a specific operation store.

The method will replace the operations type to process it correctly. An operation can't be started twice, it has to be stopped or fully processed first.

Parameters
[in,out]opOperation
[in]typeType of operation
[in,out]storeOperation store
[in]delayDelay
Returns
GNUNET_OK on success, otherwise GNUNET_SYSERR

Definition at line 192 of file gnunet-service-messenger_operation.c.

196{
197 GNUNET_assert ((op) && (store));
198
199 if (op->task)
200 return GNUNET_SYSERR;
201
202 const struct GNUNET_TIME_Absolute timestamp = GNUNET_TIME_absolute_add (
204 delay
205 );
206
208 delay,
211 op
212 );
213
214 op->type = type;
215 op->timestamp = timestamp;
216 op->store = store;
217
218 return GNUNET_OK;
219}
@ GNUNET_SYSERR
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:111
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_add(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Relative duration)
Add a given relative duration to the given start time.
Definition: time.c:450
Time for absolute times used by GNUnet, in microseconds.

References callback_operation(), GNUNET_assert, GNUNET_OK, GNUNET_SCHEDULER_add_delayed_with_priority(), GNUNET_SCHEDULER_PRIORITY_BACKGROUND, GNUNET_SYSERR, GNUNET_TIME_absolute_add(), GNUNET_TIME_absolute_get(), op, GNUNET_MESSENGER_Operation::store, and type.

Referenced by use_store_operation().

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

◆ stop_operation()

enum GNUNET_GenericReturnValue stop_operation ( struct GNUNET_MESSENGER_Operation op)

Stops an active operation and resets its type to be GNUNET_MESSENGER_OP_UNKNOWN.

Returns
GNUNET_OK on success, otherwise GNUNET_SYSERR

Definition at line 223 of file gnunet-service-messenger_operation.c.

224{
226
227 if (! op->task)
228 return GNUNET_SYSERR;
229
231 op->task = NULL;
232
234 op->timestamp = GNUNET_TIME_absolute_get_zero_ ();
235 op->store = NULL;
236
237 return GNUNET_OK;
238}

References GNUNET_assert, GNUNET_MESSENGER_OP_UNKNOWN, GNUNET_OK, GNUNET_SCHEDULER_cancel(), GNUNET_SYSERR, GNUNET_TIME_absolute_get_zero_(), and op.

Referenced by cancel_store_operation(), and use_store_operation().

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