gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r22323 - gnunet/src/util


From: gnunet
Subject: [GNUnet-SVN] r22323 - gnunet/src/util
Date: Tue, 26 Jun 2012 23:07:02 +0200

Author: grothoff
Date: 2012-06-26 23:07:02 +0200 (Tue, 26 Jun 2012)
New Revision: 22323

Added:
   gnunet/src/util/gnunet-uri.c
Modified:
   gnunet/src/util/Makefile.am
Log:
-add tool to handle gnunet-uris

Modified: gnunet/src/util/Makefile.am
===================================================================
--- gnunet/src/util/Makefile.am 2012-06-26 21:06:47 UTC (rev 22322)
+++ gnunet/src/util/Makefile.am 2012-06-26 21:07:02 UTC (rev 22323)
@@ -122,7 +122,8 @@
 bin_PROGRAMS = \
  gnunet-service-resolver \
  gnunet-resolver \
- gnunet-rsa
+ gnunet-rsa \
+ gnunet-uri 
 
 
 gnunet_service_resolver_SOURCES = \
@@ -151,6 +152,15 @@
 gnunet_rsa_DEPENDENCIES = \
   libgnunetutil.la
 
+
+gnunet_uri_SOURCES = \
+ gnunet-uri.c         
+gnunet_uri_LDADD = \
+  $(top_builddir)/src/util/libgnunetutil.la \
+  $(GN_LIBINTL)
+gnunet_uri_DEPENDENCIES = \
+  libgnunetutil.la
+
 plugin_LTLIBRARIES = \
   libgnunet_plugin_test.la
 

Added: gnunet/src/util/gnunet-uri.c
===================================================================
--- gnunet/src/util/gnunet-uri.c                                (rev 0)
+++ gnunet/src/util/gnunet-uri.c        2012-06-26 21:07:02 UTC (rev 22323)
@@ -0,0 +1,181 @@
+/*
+     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 3, 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 util/gnunet-uri.c
+ * @brief tool to dispatch URIs to the appropriate GNUnet helper process
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+
+/**
+ * Global return value.
+ */
+static int ret = 1;
+
+/**
+ * Helper process we started.
+ */
+static struct GNUNET_OS_Process *p;
+
+/**
+ * Pipe used to communicate shutdown via signal.
+ */
+static struct GNUNET_DISK_PipeHandle *sigpipe;
+
+
+/**
+ * Task triggered whenever we receive a SIGCHLD (child
+ * process died) or when user presses CTRL-C.
+ *
+ * @param cls closure, NULL
+ * @param tc scheduler context
+ */
+static void
+maint_child_death (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  enum GNUNET_OS_ProcessStatusType type;
+  unsigned long code;
+
+  if ( (GNUNET_OK ==
+       GNUNET_OS_process_status (p, &type, &code)) &&
+       (type == GNUNET_OS_PROCESS_EXITED) &&
+       (0 == code) )
+    ret = 0;
+  else
+    GNUNET_OS_process_kill (p, SIGTERM);
+  GNUNET_OS_process_destroy (p);
+}
+
+
+/**
+ * Main function that will be run by the scheduler.
+ *
+ * @param cls closure
+ * @param args remaining command-line arguments
+ * @param cfgfile name of the configuration file used (for saving, can be 
NULL!)
+ * @param cfg configuration
+ */
+static void
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  const char *uri;
+  const char *slash;
+  char *subsystem;
+  char *program;
+  GNUNET_SCHEDULER_TaskIdentifier rt;
+
+  if (NULL == (uri = args[0]))
+  {
+    fprintf (stderr, _("No URI specified on command line\n"));
+    return;
+  }
+  if (0 != strncasecmp ("gnunet://", uri, strlen ("gnunet://")))
+  {
+    fprintf (stderr, _("Invalid URI: does not start with `%s'\n"),
+            "gnunet://");
+    return;
+  }
+  uri += strlen ("gnunet://");
+  if (NULL == (slash = strchr (uri, '/')))
+  {
+    fprintf (stderr, _("Invalid URI: fails to specify subsystem\n"));
+    return;
+  }
+  subsystem = GNUNET_strndup (uri, slash - uri);
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg,
+                                            "uri",
+                                            subsystem,
+                                            &program))
+  {
+    fprintf (stderr, _("No handler known for subsystem `%s'\n"), subsystem);
+    return;
+  }
+  rt = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                      GNUNET_DISK_pipe_handle (sigpipe,
+                                                               
GNUNET_DISK_PIPE_END_READ),
+                                      &maint_child_death, NULL);   
+  p = GNUNET_OS_start_process (GNUNET_NO,
+                              NULL, NULL,
+                              program,
+                              program,
+                              args[0], 
+                              NULL);
+  if (NULL == p)
+    GNUNET_SCHEDULER_cancel (rt);
+}
+
+
+/**
+ * Signal handler called for SIGCHLD.  Triggers the
+ * respective handler by writing to the trigger pipe.
+ */
+static void
+sighandler_child_death ()
+{
+  static char c;
+  int old_errno = errno;       /* back-up errno */
+
+  GNUNET_break (1 ==
+               GNUNET_DISK_file_write (GNUNET_DISK_pipe_handle
+                                       (sigpipe, GNUNET_DISK_PIPE_END_WRITE),
+                                       &c, sizeof (c)));
+  errno = old_errno;           /* restore errno */
+}
+
+
+/**
+ * The main function to handle gnunet://-URIs.
+ *
+ * @param argc number of arguments from the command line
+ * @param argv command line arguments
+ * @return 0 ok, 1 on error
+ */
+int
+main (int argc, char *const *argv)
+{
+  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_OPTION_END
+  };
+  struct GNUNET_SIGNAL_Context *shc_chld;
+
+  if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
+    return 2;
+  sigpipe = GNUNET_DISK_pipe (GNUNET_NO, GNUNET_NO, GNUNET_NO, GNUNET_NO);
+  GNUNET_assert (sigpipe != NULL);
+  shc_chld =
+    GNUNET_SIGNAL_handler_install (GNUNET_SIGCHLD, &sighandler_child_death);
+  if (GNUNET_OK !=
+      GNUNET_PROGRAM_run (argc, argv, "gnunet-uri URI",
+                         gettext_noop ("Perform default-actions for GNUnet 
URIs"),
+                         options, &run, NULL)) 
+    return 1;
+  GNUNET_SIGNAL_handler_uninstall (shc_chld);
+  shc_chld = NULL;
+  GNUNET_DISK_pipe_close (sigpipe);
+  sigpipe = NULL; 
+  return ret;
+}
+
+/* end of gnunet-uri.c */




reply via email to

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