View Issue Details

IDProjectCategoryView StatusLast Update
0001782gnunet-gtkgnunet-setuppublic2012-02-28 11:06
ReporterChristian Grothoff Assigned Tovminko  
PrioritynormalSeverityfeatureReproducibilityalways
Status closedResolutionopen 
Product Version0.9.0 
Target Version0.9.2Fixed in Version0.9.2 
Summary0001782: gnunet-setup always permits optional options of gnunet-hostlist-daemon
DescriptionIf GNUnet was compiled without MHD, offering a hostlist and/or advertising one's hostlist are not options gnunet-hostlist-daemon would support.

gnunet-setup does not detect this and allows the user to select those options anyway. As a result, an "invalid" configuration is generated which then causes gnunet-daemon-hostlist to exit with an error message on startup (just to be re-started repeatedly by ARM).
TagsNo tags attached.
Attached Files
gnunet-bug1782-fix.patch (8,616 bytes)   
Index: src/setup/gnunet-setup-hostlist-server.c
===================================================================
--- src/setup/gnunet-setup-hostlist-server.c	(revision 0)
+++ src/setup/gnunet-setup-hostlist-server.c	(revision 0)
@@ -0,0 +1,205 @@
+/*
+     This file is part of GNUnet.
+     (C) 2012 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, or (at your
+     option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+
+/**
+ * @file src/gnunet-setup-hostlist-server.c
+ * @brief (de)sensitize UI elements related to hostlist server configuration
+ *        based on the build configuration of the hostlist daemon
+ * @author Christian Grothoff
+ */
+#include "gnunet-setup.h"
+#include <gnunet/gnunet_util_lib.h>
+
+
+/**
+ * Timeout for hostlist daemon to print help information
+ */
+#define CMD_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 3)
+
+
+/**
+ * Function called to report the result of testing the hostlist daemon.
+ *
+ * @param cls closure
+ * @param result GNUNET_YES if the hostlist daemon has an integrated hostlist
+ *               server, GNUNET_NO otherwise
+ */
+typedef void (*TestHostlistDaemonCallback) (void *cls,
+                                            int result);
+
+
+/**
+ * Context for running hostlist daemon and processing its output.
+ */
+struct CommandContext
+{
+  /**
+   * Handle to the command.
+   */
+  struct GNUNET_OS_CommandHandle *cmd;
+
+  /**
+   * Where to pass the result.
+   */
+  TestHostlistDaemonCallback callback;
+  
+  /**
+   * Closure for the callback.
+   */
+  void *callback_cls;
+
+  /**
+   * GNUNET_YES if the target argument was found, GNUNET_NO otherwise.
+   */
+  int found;
+
+};
+
+
+void
+set_checkbutton_status (void *cls,
+                        int result)
+{
+  GtkWidget * widget = cls;
+  GtkToggleButton *button;
+
+  if (GNUNET_YES != result)
+  {
+    gtk_widget_set_sensitive (widget, FALSE);
+    button = GTK_TOGGLE_BUTTON (widget);
+    if (button == NULL)
+    {
+      GNUNET_break (0);
+      return;
+    }
+    /* also deactivate the checkbutton since this option could be enabled
+       by editing the config file manually */
+    gtk_toggle_button_set_active (button, FALSE);
+  }
+}
+
+
+void
+set_spinbutton_status (void *cls,
+                       int result)
+{
+  GtkWidget * widget = cls;
+
+  if (GNUNET_YES != result)
+    gtk_widget_set_sensitive (widget, FALSE);
+}
+
+
+/**
+ * Process the output from the 'gnunet-daemon-hostlist -h' command
+ * to find out whether the hostlist daemon can provide a hostlist server.
+ *
+ * @param cls the 'struct CommandContext'
+ * @param line line of output, NULL at the end
+ */
+static void
+process_hostlist_daemon_output (void *cls, const char *line)
+{
+  struct CommandContext *ctx = cls;
+  char *t;
+  char *w;
+
+  if (NULL == line)
+  {
+    ctx->callback (ctx->callback_cls, ctx->found);
+    GNUNET_OS_command_stop (ctx->cmd);
+    GNUNET_free (ctx);
+    return;
+  }
+
+  t = GNUNET_strdup (line);
+  w = strtok (t, " ");
+  while (w != NULL)
+  {
+    if (0 == strcmp (w, "--provide-hostlist"))
+    {
+      ctx->found = GNUNET_YES;
+      break;
+    }
+    w = strtok (NULL, " ");
+  }
+  GNUNET_free (t);
+}
+
+
+/**
+ * Run 'gnunet-daemon-hostlist -h'. Output of this command will let us
+ * know whether the hostlist daemon can provide a hostlist server.
+ *
+ * @param callback function to call with the result
+ * @param cls closure for the callback
+ */
+static void
+test_hostlist_daemon (TestHostlistDaemonCallback callback,
+                      void *cls)
+{
+  struct CommandContext *ctx;
+
+  ctx = GNUNET_malloc (sizeof (struct CommandContext));
+  ctx->callback = callback;
+  ctx->callback_cls = cls;
+  ctx->found = GNUNET_NO;
+  ctx->cmd = GNUNET_OS_command_run (&process_hostlist_daemon_output,
+                                    ctx,
+                                    CMD_TIMEOUT,
+                                    "gnunet-daemon-hostlist",
+                                    "gnunet-daemon-hostlist",
+                                    "-h",
+                                    NULL);
+  if (NULL == ctx->cmd)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                _("Could not determine whether the hostlist daemon has"
+                  " an integrated hostlist server!\n"));
+    GNUNET_free (ctx);
+  }
+}
+
+
+void
+GNUNET_setup_hostlist_offer_hostlist_checkbutton_realize_cb (GtkWidget * widget,
+                                                             gpointer user_data)
+{
+  test_hostlist_daemon (&set_checkbutton_status, widget);
+}
+
+
+void
+GNUNET_setup_hostlist_advertise_checkbutton_realize_cb (GtkWidget * widget,
+                                                        gpointer user_data)
+{
+  test_hostlist_daemon (&set_checkbutton_status, widget);
+}
+
+
+void
+GNUNET_setup_hostlist_server_port_spin_button_realize_cb (GtkWidget * widget,
+                                                          gpointer user_data)
+{
+  test_hostlist_daemon (&set_spinbutton_status, widget);
+}
+
+
+/* end of gnunet-setup-hostlist-server.c */
Index: src/setup/Makefile.am
===================================================================
--- src/setup/Makefile.am	(revision 19098)
+++ src/setup/Makefile.am	(working copy)
@@ -27,7 +27,8 @@
   gnunet-setup-datastore-config.c \
   gnunet-setup-datacache-plugins.c \
   gnunet-setup-datacache-config.c \
-  gnunet-setup-hostlist-editing.c 
+  gnunet-setup-hostlist-editing.c \
+  gnunet-setup-hostlist-server.c 
 gnunet_setup_LDADD = \
   $(top_builddir)/src/lib/libgnunetgtk.la \
   @GTK_LIBS@ @GNUNET_LIBS@ @GLADE_LIBS@ \
@@ -35,4 +36,4 @@
   -lgnunetutil -lgnunetnat \
   $(INTLLIBS) 
 gnunet_setup_LDFLAGS = \
-  -export-dynamic 
\ No newline at end of file
+  -export-dynamic 
Index: contrib/gnunet_setup_gtk_main_window.glade
===================================================================
--- contrib/gnunet_setup_gtk_main_window.glade	(revision 19098)
+++ contrib/gnunet_setup_gtk_main_window.glade	(working copy)
@@ -421,6 +421,7 @@
                                         <property name="use_action_appearance">False</property>
                                         <property name="xalign">0</property>
                                         <property name="draw_indicator">True</property>
+                                        <signal name="realize" handler="GNUNET_setup_hostlist_offer_hostlist_checkbutton_realize_cb" swapped="no"/>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
@@ -437,6 +438,7 @@
                                         <property name="use_action_appearance">False</property>
                                         <property name="xalign">0</property>
                                         <property name="draw_indicator">True</property>
+                                        <signal name="realize" handler="GNUNET_setup_hostlist_advertise_checkbutton_realize_cb" swapped="no"/>
                                       </object>
                                       <packing>
                                         <property name="expand">False</property>
@@ -473,6 +475,7 @@
                                             <property name="secondary_icon_sensitive">True</property>
                                             <property name="adjustment">GNUNET_setup_hostlist_server_port_adjustment</property>
                                             <property name="numeric">True</property>
+                                            <signal name="realize" handler="GNUNET_setup_hostlist_server_port_spin_button_realize_cb" swapped="no"/>
                                           </object>
                                           <packing>
                                             <property name="expand">False</property>
gnunet-bug1782-fix.patch (8,616 bytes)   

Activities

vminko

2012-01-12 04:12

developer   ~0005258

The proposed fix is attached.

Christian Grothoff

2012-01-12 09:35

manager   ~0005259

Wonderful. Applied as SVN 19100.

Issue History

Date Modified Username Field Change
2011-09-18 22:54 Christian Grothoff New Issue
2011-09-18 22:54 Christian Grothoff Status new => assigned
2011-09-18 22:54 Christian Grothoff Assigned To => Christian Grothoff
2011-11-04 11:17 Christian Grothoff Priority normal => low
2011-12-01 10:02 Christian Grothoff Priority low => high
2011-12-01 10:02 Christian Grothoff Target Version => 0.9.1
2011-12-11 12:32 Christian Grothoff Priority high => normal
2011-12-11 12:32 Christian Grothoff Status assigned => confirmed
2011-12-11 12:32 Christian Grothoff Target Version 0.9.1 =>
2011-12-11 12:34 Christian Grothoff Assigned To Christian Grothoff =>
2012-01-12 04:12 vminko File Added: gnunet-bug1782-fix.patch
2012-01-12 04:12 vminko Note Added: 0005258
2012-01-12 09:35 Christian Grothoff Note Added: 0005259
2012-01-12 09:35 Christian Grothoff Assigned To => vminko
2012-01-12 09:35 Christian Grothoff Status confirmed => assigned
2012-01-12 09:36 Christian Grothoff Status assigned => resolved
2012-01-12 09:36 Christian Grothoff Product Version => 0.9.0
2012-01-12 09:36 Christian Grothoff Fixed in Version => 0.9.2
2012-01-12 09:36 Christian Grothoff Target Version => 0.9.2
2012-02-28 11:06 Christian Grothoff Status resolved => closed