GNUnet debian-0.24.3-23-g589b01d60
gnunet-service-messenger_message_state.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2020--2024 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
27
28#include "gnunet_common.h"
30
31void
33{
35
36 init_list_messages (&(state->last_messages));
37}
38
39
40void
42{
44
45 clear_list_messages (&(state->last_messages));
46}
47
48
49void
51 struct GNUNET_HashCode *hash)
52{
53 GNUNET_assert ((state) && (hash));
54
55 if (state->last_messages.head)
56 GNUNET_memcpy (hash, &(state->last_messages.head->hash), sizeof(*hash));
57 else
58 memset (hash, 0, sizeof(*hash));
59}
60
61
62const struct GNUNET_HashCode*
64{
66
67 if (state->last_messages.head == state->last_messages.tail)
68 return NULL;
69
70 return &(state->last_messages.tail->hash);
71}
72
73
74void
76 enum GNUNET_GenericReturnValue requested,
77 const struct GNUNET_MESSENGER_Message *message,
78 const struct GNUNET_HashCode *hash)
79{
80 GNUNET_assert ((state) && (message) && (hash));
81
82 if ((GNUNET_YES == requested) ||
85 (GNUNET_is_zero (hash)) ||
86 (get_message_discourse (message)))
87 return;
88
90 remove_from_list_messages (&(state->last_messages),
91 &(message->body.merge.previous));
92 remove_from_list_messages (&(state->last_messages),
93 &(message->header.previous));
94
95 add_to_list_messages (&(state->last_messages), hash);
96}
97
98
99void
101 const char *path)
102{
103 char *last_messages_file;
104
105 GNUNET_assert ((state) && (path));
106
107 GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
108
109 load_list_messages (&(state->last_messages), last_messages_file);
110 GNUNET_free (last_messages_file);
111}
112
113
114void
116 const char *path)
117{
118 char *last_messages_file;
119
120 GNUNET_assert ((state) && (path));
121
122 GNUNET_asprintf (&last_messages_file, "%s%s", path, "last_messages.list");
123
124 save_list_messages (&(state->last_messages), last_messages_file);
125 GNUNET_free (last_messages_file);
126}
enum State state
current state of profiling
void remove_from_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Removes the first entry with a matching hash from the list.
void clear_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Clears the list of message hashes.
void load_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Loads the list of message hashes from a file under a given path.
void init_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Initializes list of message hashes as empty list.
void save_list_messages(const struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Saves the list of message hashes to a file under a given path.
void add_to_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Adds a specific hash from a message to the end of the list.
const struct GNUNET_HashCode * get_message_state_merge_hash(const struct GNUNET_MESSENGER_MessageState *state)
void save_message_state(const struct GNUNET_MESSENGER_MessageState *state, const char *path)
void clear_message_state(struct GNUNET_MESSENGER_MessageState *state)
void get_message_state_chain_hash(const struct GNUNET_MESSENGER_MessageState *state, struct GNUNET_HashCode *hash)
void init_message_state(struct GNUNET_MESSENGER_MessageState *state)
void update_message_state(struct GNUNET_MESSENGER_MessageState *state, enum GNUNET_GenericReturnValue requested, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
void load_message_state(struct GNUNET_MESSENGER_MessageState *state, const char *path)
commonly used definitions; globals in this file are exempt from the rule that the module name ("commo...
#define GNUNET_is_zero(a)
Check that memory in a is all zeros.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_YES
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_free(ptr)
Wrapper around free.
@ GNUNET_MESSENGER_KIND_INFO
The info kind.
@ GNUNET_MESSENGER_KIND_REQUEST
The request kind.
@ GNUNET_MESSENGER_KIND_MERGE
The merge kind.
const struct GNUNET_ShortHashCode * get_message_discourse(const struct GNUNET_MESSENGER_Message *message)
Returns the discourse hash of a message depending on its kind.
A 512-bit hashcode.
struct GNUNET_MESSENGER_MessageMerge merge
struct GNUNET_HashCode previous
The hash of the previous message from the senders perspective.
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_HashCode previous
The hash of a second previous message.
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_MessageBody body
Body.