GNUnet  0.11.x
gnunet-service-messenger_list_messages.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C) 2020--2021 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 void
30 {
31  GNUNET_assert(messages);
32 
33  messages->head = NULL;
34  messages->tail = NULL;
35 }
36 
37 void
39 {
40  GNUNET_assert(messages);
41 
42  while (messages->head)
43  {
44  struct GNUNET_MESSENGER_ListMessage *element = messages->head;
45 
46  GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
47  GNUNET_free(element);
48  }
49 
50  messages->head = NULL;
51  messages->tail = NULL;
52 }
53 
54 void
56  const struct GNUNET_HashCode *hash)
57 {
58  GNUNET_assert((messages) && (hash));
59 
61 
62  GNUNET_memcpy(&(element->hash), hash, sizeof(struct GNUNET_HashCode));
63 
64  GNUNET_CONTAINER_DLL_insert_tail(messages->head, messages->tail, element);
65 }
66 
67 void
69  const struct GNUNET_MESSENGER_ListMessages *origin)
70 {
71  GNUNET_assert((messages) && (origin));
72 
73  struct GNUNET_MESSENGER_ListMessage *element;
74 
75  for (element = origin->head; element; element = element->next)
76  add_to_list_messages (messages, &(element->hash));
77 }
78 
79 void
81  const struct GNUNET_HashCode *hash)
82 {
83  GNUNET_assert((messages) && (hash));
84 
85  struct GNUNET_MESSENGER_ListMessage *element;
86 
87  for (element = messages->head; element; element = element->next)
88  if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash), hash))
89  {
90  GNUNET_CONTAINER_DLL_remove(messages->head, messages->tail, element);
91  GNUNET_free(element);
92  break;
93  }
94 }
95 
96 void
98  const char *path)
99 {
100  GNUNET_assert((messages) && (path));
101 
102  if (GNUNET_YES != GNUNET_DISK_file_test (path))
103  return;
104 
106 
108  path, GNUNET_DISK_OPEN_READ, permission
109  );
110 
111  if (!handle)
112  return;
113 
115 
116  struct GNUNET_HashCode hash;
117  ssize_t len;
118 
119  do {
120  len = GNUNET_DISK_file_read(handle, &hash, sizeof(hash));
121 
122  if (len != sizeof(hash))
123  break;
124 
125  add_to_list_messages(messages, &hash);
126  } while (len == sizeof(hash));
127 
129 }
130 
131 void
133  const char *path)
134 {
135  GNUNET_assert((messages) && (path));
136 
138 
141  );
142 
143  if (!handle)
144  return;
145 
147 
148  struct GNUNET_MESSENGER_ListMessage *element;
149 
150  for (element = messages->head; element; element = element->next)
151  GNUNET_DISK_file_write(handle, &(element->hash), sizeof(element->hash));
152 
155 }
static struct GNUNET_DNS_Handle * handle
Handle to transport service.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...
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 copy_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_MESSENGER_ListMessages *origin)
Copies all message hashes from an origin to another 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.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_YES
Definition: gnunet_common.h:97
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1235
enum GNUNET_GenericReturnValue 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:482
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:686
off_t GNUNET_DISK_file_seek(const struct GNUNET_DISK_FileHandle *h, off_t offset, enum GNUNET_DISK_Seek whence)
Move the read/write pointer in a file.
Definition: disk.c:206
GNUNET_DISK_AccessPermissions
File access permissions, UNIX-style.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition: disk.c:1425
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1306
ssize_t GNUNET_DISK_file_read(const struct GNUNET_DISK_FileHandle *h, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition: disk.c:622
@ GNUNET_DISK_OPEN_READ
Open the file for reading.
@ GNUNET_DISK_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
@ GNUNET_DISK_SEEK_SET
Seek an absolute position (from the start of the file).
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
Definition: crypto_hash.c:201
#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.
#define GNUNET_free(ptr)
Wrapper around free.
Handle used to access files (and pipes).
A 512-bit hashcode.
struct GNUNET_MESSENGER_ListMessage * next
struct GNUNET_MESSENGER_ListMessage * head
struct GNUNET_MESSENGER_ListMessage * tail