Christian Grothoff <[email protected]> writes:

> Yes, we should modify the code along the lines of your proposal.
>
> -Christian

Then does the attached patch sound reasonable?

As the commit message says, it adds the 'agpl_url' field and
automatically adds a handler when that field is not NULL.  There is also
a patch for gnunet-ext adding that field to the project data structure.

Thanks,
A.V.

P.S. the problem that started this whole discussion in the end was
found.  It had nothing to do with GNUnet (I made an error in the code I
wrote), but if anything it provided some improvements (if the patch is
accepted) to GNUnet...

>From a3bffbe0e38fd336ad2230185c79e9e0466e4a11 Mon Sep 17 00:00:00 2001
From: Alessio Vanni <[email protected]>
Date: Wed, 27 May 2020 15:01:30 +0200
Subject: [PATCH] Make REQUEST_AGPL messages configurable and add handler by
 default

This makes two changes:

* Add a field to `struct GNUNET_OS_ProjectData' containing a URL (as a string)
pointing to the source code of the application.

* If the field is not NULL, add a handler for the REQUEST_AGPL messages
sending the specified URL to the client.

The handler is added both in client-service communications (i.e. local
services that don't make requests to other peers in the network) and in
peer-peer communications (CADET.)  This way, any client (local or remote with
CADET) can request the source code location using a standardized mechanism
instead of writing ad-hoc solutions (unless the service/peer explicitly
specifies a NULL pointer.)
---
 src/cadet/cadet_api.c          | 31 ++++++++++++++++++++++++++++++-
 src/include/gnunet_os_lib.h    |  8 ++++++++
 src/include/gnunet_protocols.h | 30 +++++++++++++++++-------------
 src/util/os_installation.c     |  1 +
 src/util/service.c             |  7 +++++--
 5 files changed, 61 insertions(+), 16 deletions(-)

diff --git a/src/cadet/cadet_api.c b/src/cadet/cadet_api.c
index 68bd4c290..3a75266b7 100644
--- a/src/cadet/cadet_api.c
+++ b/src/cadet/cadet_api.c
@@ -994,6 +994,32 @@ GNUNET_CADET_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 }
 
 
+/**
+ * Function to return link to AGPL source upon request.
+ *
+ * @param cls closure with the identification of the client
+ * @param msg AGPL request
+ */
+static void
+return_agpl (void *cls, const struct GNUNET_MessageHeader *msg)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+  struct GNUNET_MQ_Handle *mq;
+  struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_MessageHeader *res;
+  size_t slen;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
+
+  (void) msg;
+  slen = strlen (pd->agpl_url) + 1;
+  env = GNUNET_MQ_msg_extra (res, GNUNET_MESSAGE_TYPE_RESPONSE_AGPL, slen);
+  memcpy (&res[1], GNUNET_AGPL_URL, slen);
+  mq = GNUNET_SERVICE_client_get_mq (client);
+  GNUNET_MQ_send (mq, env);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
 /**
  * Open a port to receive incomming MQ-based channels.
  *
@@ -1016,6 +1042,7 @@ GNUNET_CADET_open_port (struct GNUNET_CADET_Handle *h,
                         const struct GNUNET_MQ_MessageHandler *handlers)
 {
   struct GNUNET_CADET_Port *p;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
 
   GNUNET_assert (NULL != connects);
   GNUNET_assert (NULL != disconnects);
@@ -1039,7 +1066,9 @@ GNUNET_CADET_open_port (struct GNUNET_CADET_Handle *h,
   p->cls = connects_cls;
   p->window_changes = window_changes;
   p->disconnects = disconnects;
-  p->handlers = GNUNET_MQ_copy_handlers (handlers);
+  p->handlers = (NULL == pd->agpl_url)
+    ? GNUNET_MQ_copy_handlers (handlers)
+    : GNUNET_MQ_copy_handlers2 (handlers, &return_agpl, NULL);
 
   GNUNET_assert (GNUNET_OK == open_port_cb (h, &p->id, p));
   return p;
diff --git a/src/include/gnunet_os_lib.h b/src/include/gnunet_os_lib.h
index a6188c1ca..b583cc493 100644
--- a/src/include/gnunet_os_lib.h
+++ b/src/include/gnunet_os_lib.h
@@ -287,6 +287,14 @@ struct GNUNET_OS_ProjectData
    * If this field is NULL, the path is automatically inferred.
    */
   char *gettext_path;
+
+  /**
+   * URL pointing to the source code of the application.  Required for AGPL.
+   * Setting this to NULL disables the built-in mechanism, but you must
+   * provide it in some other way.  If non-NULL, message type 1 and 2 are
+   * reserved.
+   */
+  char *agpl_url;
 };
 
 
diff --git a/src/include/gnunet_protocols.h b/src/include/gnunet_protocols.h
index 3b05fb8bb..282bb53d1 100644
--- a/src/include/gnunet_protocols.h
+++ b/src/include/gnunet_protocols.h
@@ -50,25 +50,29 @@ extern "C" {
 #endif
 
 /*******************************************************************************
- * UTIL message types
- ******************************************************************************/
+* Deprecated
+* *****************************************************************************/
 
 /**
  * Test if service is online.
  *
  * @deprecated!
  */
-#define GNUNET_MESSAGE_TYPE_TEST 1
+#define GNUNET_MESSAGE_TYPE_TEST 0
+
+/*******************************************************************************
+* AGPL source code download
+* *****************************************************************************/
 
 /**
- * Dummy messages for testing / benchmarking.
+ * Message to request source code link.
  */
-#define GNUNET_MESSAGE_TYPE_DUMMY 2
+#define GNUNET_MESSAGE_TYPE_REQUEST_AGPL 1
 
 /**
- * Another dummy messages for testing / benchmarking.
+ * Source code link.
  */
-#define GNUNET_MESSAGE_TYPE_DUMMY2 3
+#define GNUNET_MESSAGE_TYPE_RESPONSE_AGPL 2
 
 /*******************************************************************************
  * RESOLVER message types
@@ -85,18 +89,18 @@ extern "C" {
 #define GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE 5
 
 /*******************************************************************************
-* AGPL source code download
-* *****************************************************************************/
+ * UTIL message types
+ ******************************************************************************/
 
 /**
- * Message to request source code link.
+ * Dummy messages for testing / benchmarking.
  */
-#define GNUNET_MESSAGE_TYPE_REQUEST_AGPL 6
+#define GNUNET_MESSAGE_TYPE_DUMMY 6
 
 /**
- * Source code link.
+ * Another dummy messages for testing / benchmarking.
  */
-#define GNUNET_MESSAGE_TYPE_RESPONSE_AGPL 7
+#define GNUNET_MESSAGE_TYPE_DUMMY2 7
 
 
 /*******************************************************************************
diff --git a/src/util/os_installation.c b/src/util/os_installation.c
index dcd31dc2c..714df6957 100644
--- a/src/util/os_installation.c
+++ b/src/util/os_installation.c
@@ -70,6 +70,7 @@ static const struct GNUNET_OS_ProjectData default_pd = {
   .is_gnu = 1,
   .gettext_domain = PACKAGE,
   .gettext_path = NULL,
+  .agpl_url = GNUNET_AGPL_URL,
 };
 
 /**
diff --git a/src/util/service.c b/src/util/service.c
index 9dc14eba9..ea078b19b 100644
--- a/src/util/service.c
+++ b/src/util/service.c
@@ -1823,9 +1823,10 @@ return_agpl (void *cls, const struct GNUNET_MessageHeader *msg)
   struct GNUNET_MQ_Envelope *env;
   struct GNUNET_MessageHeader *res;
   size_t slen;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
 
   (void) msg;
-  slen = strlen (GNUNET_AGPL_URL) + 1;
+  slen = strlen (pd->agpl_url) + 1;
   env = GNUNET_MQ_msg_extra (res, GNUNET_MESSAGE_TYPE_RESPONSE_AGPL, slen);
   memcpy (&res[1], GNUNET_AGPL_URL, slen);
   mq = GNUNET_SERVICE_client_get_mq (client);
@@ -2019,7 +2020,9 @@ GNUNET_SERVICE_run_ (int argc,
   sh.connect_cb = connect_cb;
   sh.disconnect_cb = disconnect_cb;
   sh.cb_cls = cls;
-  sh.handlers = GNUNET_MQ_copy_handlers (handlers);
+  sh.handlers = (NULL == pd->agpl_url)
+    ? GNUNET_MQ_copy_handlers (handlers)
+    : GNUNET_MQ_copy_handlers2 (handlers, &return_agpl, NULL);
   sh.service_name = service_name;
   sh.ret = 0;
   /* setup subsystems */
-- 
2.26.2

>From 5cbf2307bbf834789ceb02d785d67e5bdc1aa748 Mon Sep 17 00:00:00 2001
From: Alessio Vanni <[email protected]>
Date: Wed, 27 May 2020 15:15:19 +0200
Subject: [PATCH] Add agpl_url field

---
 src/ext/gnunet-ext.c         | 1 +
 src/ext/gnunet-service-ext.c | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/ext/gnunet-ext.c b/src/ext/gnunet-ext.c
index 7a77c17..2b91276 100644
--- a/src/ext/gnunet-ext.c
+++ b/src/ext/gnunet-ext.c
@@ -54,6 +54,7 @@ static const struct GNUNET_OS_ProjectData gnunetext_pd =
    .is_gnu = 1,
    .gettext_domain = PACKAGE,
    .gettext_path = NULL,
+   .agpl_url = "https://gnunet.org/git/gnunet-ext.git";,
   };
 
 /**
diff --git a/src/ext/gnunet-service-ext.c b/src/ext/gnunet-service-ext.c
index fa62291..d172eb2 100644
--- a/src/ext/gnunet-service-ext.c
+++ b/src/ext/gnunet-service-ext.c
@@ -78,6 +78,7 @@ static const struct GNUNET_OS_ProjectData gnunetext_pd =
   .is_gnu = 1,
   .gettext_domain = PACKAGE,
   .gettext_path = NULL,
+  .agpl_url = "https://gnunet.org/git/gnunet-ext.git";,
 };
 
 /**
-- 
2.26.2

Reply via email to