gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] 06/08: MESSENGER: Adjust peer store, load and save list of peer


From: gnunet
Subject: [gnunet] 06/08: MESSENGER: Adjust peer store, load and save list of peers in store
Date: Tue, 23 Jan 2024 01:46:25 +0100

This is an automated email from the git hooks/post-receive script.

thejackimonster pushed a commit to branch master
in repository gnunet.

commit 1eeceed4a3426e162db556e56910b1c0175e0fc1
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Mon Jan 22 23:30:40 2024 +0100

    MESSENGER: Adjust peer store, load and save list of peers in store
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 src/service/messenger/Makefile.am                  |   2 +-
 .../gnunet-service-messenger_message_handle.c      |   2 +-
 ...ore.c => gnunet-service-messenger_peer_store.c} | 106 +++++++++++++++++++--
 ...ore.h => gnunet-service-messenger_peer_store.h} |  36 +++++--
 .../messenger/gnunet-service-messenger_room.c      |  12 +++
 .../messenger/gnunet-service-messenger_room.h      |   2 +-
 src/service/messenger/meson.build                  |   2 +-
 src/service/messenger/messenger_api_list_tunnels.c |   8 +-
 8 files changed, 151 insertions(+), 19 deletions(-)

diff --git a/src/service/messenger/Makefile.am 
b/src/service/messenger/Makefile.am
index ae2285a90..6b408c4fe 100644
--- a/src/service/messenger/Makefile.am
+++ b/src/service/messenger/Makefile.am
@@ -36,7 +36,6 @@ libgnunetmessenger_la_SOURCES = \
   messenger_api.c \
   messenger_api_contact.c messenger_api_contact.h \
   messenger_api_contact_store.c messenger_api_contact_store.h \
-  messenger_api_peer_store.c messenger_api_peer_store.h \
   messenger_api_message.c messenger_api_message.h \
   messenger_api_message_kind.c messenger_api_message_kind.h \
   messenger_api_list_tunnels.c messenger_api_list_tunnels.h \
@@ -118,6 +117,7 @@ gnunet_service_messenger_SOURCES = \
   gnunet-service-messenger_message_store.c 
gnunet-service-messenger_message_store.h \
   gnunet-service-messenger_operation_store.c 
gnunet-service-messenger_operation_store.h \
   gnunet-service-messenger_operation.c gnunet-service-messenger_operation.h \
+  gnunet-service-messenger_peer_store.c gnunet-service-messenger_peer_store.h \
   gnunet-service-messenger_basement.c gnunet-service-messenger_basement.h \
   gnunet-service-messenger_handle.c gnunet-service-messenger_handle.h \
   gnunet-service-messenger_room.c gnunet-service-messenger_room.h \
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.c 
b/src/service/messenger/gnunet-service-messenger_message_handle.c
index d9ee1ef13..e1f15235d 100644
--- a/src/service/messenger/gnunet-service-messenger_message_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_message_handle.c
@@ -96,7 +96,7 @@ handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
   struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
 
   if (0 == GNUNET_memcmp (session->peer, &(message->body.peer.peer)))
-    update_store_peer (store, &(message->body.peer.peer));
+    update_store_peer (store, &(message->body.peer.peer), GNUNET_NO);
 
   if (GNUNET_NO == contains_list_tunnels (&(room->basement),
                                           &(message->body.peer.peer)))
diff --git a/src/service/messenger/messenger_api_peer_store.c 
b/src/service/messenger/gnunet-service-messenger_peer_store.c
similarity index 66%
rename from src/service/messenger/messenger_api_peer_store.c
rename to src/service/messenger/gnunet-service-messenger_peer_store.c
index 8d8d4dbee..4d7b49db6 100644
--- a/src/service/messenger/messenger_api_peer_store.c
+++ b/src/service/messenger/gnunet-service-messenger_peer_store.c
@@ -19,12 +19,13 @@
  */
 /**
  * @author Tobias Frisch
- * @file src/messenger/messenger_api_peer_store.c
- * @brief messenger api: client implementation of GNUnet MESSENGER service
+ * @file src/messenger/gnunet-service-messenger_peer_store.c
+ * @brief GNUnet MESSENGER service
  */
 
-#include "messenger_api_peer_store.h"
+#include "gnunet-service-messenger_peer_store.h"
 
+#include "gnunet_common.h"
 #include "messenger_api_message.h"
 #include "messenger_api_util.h"
 
@@ -62,6 +63,92 @@ clear_peer_store (struct GNUNET_MESSENGER_PeerStore *store)
 }
 
 
+void
+load_peer_store (struct GNUNET_MESSENGER_PeerStore *store,
+                 const char *path)
+{
+  GNUNET_assert ((store) && (path));
+
+  if (GNUNET_YES != GNUNET_DISK_file_test (path))
+    return;
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load peer store from path: %s\n",
+             path);
+
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
+
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_READ, permission
+    );
+
+  if (! handle)
+    return;
+
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
+
+  struct GNUNET_PeerIdentity peer;
+  ssize_t len;
+
+  do {
+    len = GNUNET_DISK_file_read (handle, &peer, sizeof(peer));
+
+    if (len != sizeof(peer))
+      break;
+
+    update_store_peer (store, &peer, GNUNET_YES);
+  } while (len == sizeof(peer));
+
+  GNUNET_DISK_file_close (handle);
+}
+
+
+static enum GNUNET_GenericReturnValue
+iterate_save_peers (void *cls, const struct GNUNET_ShortHashCode *id,
+                    void *value)
+{
+  struct GNUNET_DISK_FileHandle *handle = cls;
+  struct GNUNET_PeerIdentity *peer = value;
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save peer store entry: %s\n",
+             GNUNET_sh2s(id));
+
+  if (! peer)
+    return GNUNET_YES;
+
+  GNUNET_DISK_file_write (handle, peer, sizeof(*peer));
+  return GNUNET_YES;
+}
+
+
+void
+save_peer_store (const struct GNUNET_MESSENGER_PeerStore *store,
+                 const char *path)
+{
+  GNUNET_assert ((store) && (path));
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save peer store to path: %s\n",
+             path);
+
+  enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
+                                                   | 
GNUNET_DISK_PERM_USER_WRITE);
+
+  struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
+    path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
+    );
+
+  if (! handle)
+    return;
+
+  GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
+  GNUNET_CONTAINER_multishortmap_iterate (store->peers, iterate_save_peers,
+                                          handle);
+
+  GNUNET_DISK_file_sync (handle);
+  GNUNET_DISK_file_close (handle);
+}
+
+
 struct GNUNET_MESSENGER_ClosureVerifyPeer
 {
   const struct GNUNET_MESSENGER_Message *message;
@@ -105,7 +192,7 @@ get_store_peer_of (struct GNUNET_MESSENGER_PeerStore *store,
     convert_peer_identity_to_id (&(message->body.peer.peer), &peer_id);
 
     if (0 == GNUNET_memcmp (&peer_id, &(message->header.sender_id)))
-      update_store_peer (store, &(message->body.peer.peer));
+      update_store_peer (store, &(message->body.peer.peer), GNUNET_NO);
     else
       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
                   "Sender id does not match peer identity\n");
@@ -148,15 +235,20 @@ find_store_peer (void *cls, const struct 
GNUNET_ShortHashCode *id, void *value)
 
 void
 update_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
-                   const struct GNUNET_PeerIdentity *peer)
+                   const struct GNUNET_PeerIdentity *peer,
+                   enum GNUNET_GenericReturnValue loading)
 {
   GNUNET_assert ((store) && (store->peers) && (peer));
 
   struct GNUNET_ShortHashCode peer_id;
   convert_peer_identity_to_id (peer, &peer_id);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Update peer store entry: %s\n",
-             GNUNET_sh2s (&peer_id));
+  if (GNUNET_YES == loading)
+    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load peer store entry: %s\n",
+               GNUNET_sh2s (&peer_id));
+  else
+    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Update peer store entry: %s\n",
+               GNUNET_sh2s (&peer_id));
 
   struct GNUNET_MESSENGER_ClosureFindPeer find;
   find.requested = peer;
diff --git a/src/service/messenger/messenger_api_peer_store.h 
b/src/service/messenger/gnunet-service-messenger_peer_store.h
similarity index 72%
rename from src/service/messenger/messenger_api_peer_store.h
rename to src/service/messenger/gnunet-service-messenger_peer_store.h
index 960787466..7f914abfe 100644
--- a/src/service/messenger/messenger_api_peer_store.h
+++ b/src/service/messenger/gnunet-service-messenger_peer_store.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2023 GNUnet e.V.
+   Copyright (C) 2023--2024 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -19,12 +19,12 @@
  */
 /**
  * @author Tobias Frisch
- * @file src/messenger/messenger_api_peer_store.h
- * @brief messenger api: client implementation of GNUnet MESSENGER service
+ * @file src/messenger/gnunet-service-messenger_peer_store.h
+ * @brief GNUnet MESSENGER service
  */
 
-#ifndef GNUNET_MESSENGER_API_PEER_STORE_H
-#define GNUNET_MESSENGER_API_PEER_STORE_H
+#ifndef GNUNET_SERVICE_MESSENGER_PEER_STORE_H
+#define GNUNET_SERVICE_MESSENGER_PEER_STORE_H
 
 #include "gnunet_util_lib.h"
 
@@ -51,6 +51,26 @@ init_peer_store (struct GNUNET_MESSENGER_PeerStore *store);
 void
 clear_peer_store (struct GNUNET_MESSENGER_PeerStore *store);
 
+/**
+ * Loads peer identities from a <i>file</i> into a peer <i>store</i>.
+ *
+ * @param[out] store Peer store
+ * @param[in] path Path to a file
+ */
+void
+load_peer_store (struct GNUNET_MESSENGER_PeerStore *store,
+                 const char *path);
+
+/**
+ * Saves peer identities from a peer <i>store</i> into a <i>file</i>.
+ *
+ * @param[in] store Peer store
+ * @param[in] path Path to a file
+ */
+void
+save_peer_store (const struct GNUNET_MESSENGER_PeerStore *store,
+                 const char *path);
+
 /**
  * Returns the peer identity inside the <i>store</i> which verifies the
  * signature of a given <i>message</i> as valid. The specific peer identity
@@ -74,10 +94,12 @@ get_store_peer_of (struct GNUNET_MESSENGER_PeerStore *store,
  *
  * @param[in,out] store Peer store
  * @param[in] peer Peer identity
+ * @param[in] loading Loading flag
  */
 void
 update_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
-                   const struct GNUNET_PeerIdentity *peer);
+                   const struct GNUNET_PeerIdentity *peer,
+                   enum GNUNET_GenericReturnValue loading);
 
 /**
  * Removes a <i>peer</i> identity from the <i>store</i> entirely.
@@ -89,4 +111,4 @@ void
 remove_store_peer (struct GNUNET_MESSENGER_PeerStore *store,
                    const struct GNUNET_PeerIdentity *peer);
 
-#endif //GNUNET_MESSENGER_API_PEER_STORE_H
+#endif //GNUNET_SERVICE_MESSENGER_PEER_STORE_H
diff --git a/src/service/messenger/gnunet-service-messenger_room.c 
b/src/service/messenger/gnunet-service-messenger_room.c
index 2d898eadd..288ea06d0 100644
--- a/src/service/messenger/gnunet-service-messenger_room.c
+++ b/src/service/messenger/gnunet-service-messenger_room.c
@@ -1400,6 +1400,12 @@ load_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
 
   if (GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_YES))
   {
+    char *peers_file;
+    GNUNET_asprintf (&peers_file, "%s%s", room_dir, "peers.list");
+
+    load_peer_store (get_srv_room_peer_store (room), peers_file);
+    GNUNET_free (peers_file);
+
     load_member_store (get_srv_room_member_store (room), room_dir);
     load_message_store (get_srv_room_message_store (room), room_dir);
     load_operation_store (get_srv_room_operation_store (room), room_dir);
@@ -1431,6 +1437,12 @@ save_srv_room (struct GNUNET_MESSENGER_SrvRoom *room)
   if ((GNUNET_YES == GNUNET_DISK_directory_test (room_dir, GNUNET_NO)) ||
       (GNUNET_OK == GNUNET_DISK_directory_create (room_dir)))
   {
+    char *peers_file;
+    GNUNET_asprintf (&peers_file, "%s%s", room_dir, "peers.list");
+
+    save_peer_store (get_srv_room_peer_store (room), peers_file);
+    GNUNET_free (peers_file);
+
     save_member_store (get_srv_room_member_store (room), room_dir);
     save_message_store (get_srv_room_message_store (room), room_dir);
     save_operation_store (get_srv_room_operation_store (room), room_dir);
diff --git a/src/service/messenger/gnunet-service-messenger_room.h 
b/src/service/messenger/gnunet-service-messenger_room.h
index 8b20051be..e9395cfc4 100644
--- a/src/service/messenger/gnunet-service-messenger_room.h
+++ b/src/service/messenger/gnunet-service-messenger_room.h
@@ -36,10 +36,10 @@
 #include "gnunet-service-messenger_member_store.h"
 #include "gnunet-service-messenger_message_store.h"
 #include "gnunet-service-messenger_operation_store.h"
+#include "gnunet-service-messenger_peer_store.h"
 
 #include "messenger_api_list_tunnels.h"
 #include "messenger_api_message.h"
-#include "messenger_api_peer_store.h"
 
 #define GNUNET_MESSENGER_IDLE_DELAY GNUNET_TIME_relative_multiply \
           (GNUNET_TIME_relative_get_second_ (), 5)
diff --git a/src/service/messenger/meson.build 
b/src/service/messenger/meson.build
index f6d63bc6c..1e37e192f 100644
--- a/src/service/messenger/meson.build
+++ b/src/service/messenger/meson.build
@@ -1,7 +1,6 @@
 libgnunetmessenger_src = ['messenger_api.c',
                           'messenger_api_contact.c',
                           'messenger_api_contact_store.c',
-                          'messenger_api_peer_store.c',
                           'messenger_api_message.c',
                           'messenger_api_message_kind.c',
                           'messenger_api_list_tunnels.c',
@@ -25,6 +24,7 @@ gnunetservicemessenger_src = ['gnunet-service-messenger.c',
                               'gnunet-service-messenger_message_store.c',
                               'gnunet-service-messenger_operation_store.c',
                               'gnunet-service-messenger_operation.c',
+                              'gnunet-service-messenger_peer_store.c',
                               'gnunet-service-messenger_basement.c',
                               'gnunet-service-messenger_handle.c',
                               'gnunet-service-messenger_room.c',
diff --git a/src/service/messenger/messenger_api_list_tunnels.c 
b/src/service/messenger/messenger_api_list_tunnels.c
index 355f17527..2b6245417 100644
--- a/src/service/messenger/messenger_api_list_tunnels.c
+++ b/src/service/messenger/messenger_api_list_tunnels.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2023 GNUnet e.V.
+   Copyright (C) 2020--2024 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -228,6 +228,9 @@ load_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
   if (GNUNET_YES != GNUNET_DISK_file_test (path))
     return;
 
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load list of tunnels from path: %s\n",
+             path);
+
   enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
                                                    | 
GNUNET_DISK_PERM_USER_WRITE);
 
@@ -262,6 +265,9 @@ save_list_tunnels (struct GNUNET_MESSENGER_ListTunnels 
*tunnels,
 {
   GNUNET_assert ((tunnels) && (path));
 
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save list of tunnels to path: %s\n",
+             path);
+
   enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
                                                    | 
GNUNET_DISK_PERM_USER_WRITE);
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]