Browse Source

Merge branch 'master' of gnunet.org:gnunet

ng0 5 years ago
parent
commit
cc3d270b52

+ 1 - 0
AUTHORS

@@ -49,6 +49,7 @@ Eric Noack <corvus-gnunet@cybertrench.com>
 Felix von Leitner [ diet libc snprintf for win32 ]
 Gerd Knorr <kraxel@bytesex.org>
 Glenn McGrath <bug1@iinet.net.au>
+Hartmut Goebel <h.goebel@crazy-compiler.com>
 Hendrik Pagenhardt <Hendrik.Pagenhardt@gmx.net>
 Heikki Lindholm <holin@iki.fi>
 Igor Wronsky <iwronsky@users.sourceforge.net>

+ 5 - 0
ChangeLog

@@ -1,3 +1,8 @@
+Wed 03 Apr 2019 01:54:44 PM CEST
+  Merged gnunet-qr-c-2 branch, replacing Python-based implementation
+  of gnunet-qr with C-based implementation that also integrates
+  gnunet-uri. -HG/MS/CG
+
 Wed 03 Apr 2019 01:15:57 PM CEST
   Fixed a few test case regressions (GNS, FS). -CG
 

+ 1 - 3
README

@@ -124,6 +124,7 @@ These are the optional dependencies:
 - libogg             >= 1.3.0       (for experimental conversation tool)
 - libnss                            (certtool binary (for convenient
                                      installation of GNS proxy))
+- libzbar            >= 0.10        (for gnunet-qr)
 - libpbc             >= 0.5.14      (for Attribute-Based Encryption and
                                      Identity Provider functionality)
 - libgabe                           (for Attribute-Based Encryption and
@@ -133,9 +134,6 @@ These are the optional dependencies:
                                      html output of man pages)
 - miniupnpc
 - perl5                             (for some utilities)
-- python2.7          = 2.7          (for gnunet-qr, only python 2.7
-                                     supported)
-- python-zbar        >= 0.10        (for gnunet-qr, not optional)
 - TeX Live           >= 2012        (for gnunet-bcd[*])
 - texi2mdoc                         (for automatic mdoc generation [*2])
 

+ 39 - 0
configure.ac

@@ -534,6 +534,39 @@ else
   AC_DEFINE([HAVE_LIBBLUETOOTH],[0],[Lacking bluetooth library])
 fi
 
+# check for zbar library
+zbar=0
+AC_MSG_CHECKING(for libzbar)
+AC_ARG_WITH(zbar,
+   [  --with-zbar=PFX    base of libzbar installation],
+   [AC_MSG_RESULT([$with_zbar])
+    case $with_zbar in
+      no)
+        ;;
+      yes)
+        AC_CHECK_HEADERS(zbar.h,
+          AC_CHECK_LIB([zbar], [zbar_processor_create],
+            zbar=1))
+        ;;
+      *)
+        LDFLAGS="-L$with_zbar/lib $LDFLAGS"
+        CPPFLAGS="-I$with_zbar/include $CPPFLAGS"
+        AC_CHECK_HEADERS(zbar.h,
+          AC_CHECK_LIB([zbar], [zbar_processor_create],
+            EXT_LIB_PATH="-L$with_zbar/lib $EXT_LIB_PATH"
+            zbar=1))
+        ;;
+    esac
+   ],
+   [AC_MSG_RESULT([--with-zbar not specified])
+    AC_CHECK_HEADERS(zbar.h,
+     AC_CHECK_LIB([zbar], [zbar_processor_create],
+      zbar=1))])
+AM_CONDITIONAL(HAVE_ZBAR, [test "$zbar" = 1])
+AS_IF([test "x$zbar" = x1],
+      [AC_DEFINE([HAVE_ZBAR],[1],[Have zbar library])],
+      [AC_DEFINE([HAVE_ZBAR],[0],[Lacking zbar library])])
+
 # check for jansson library
 jansson=0
 AC_MSG_CHECKING(for libjansson)
@@ -563,6 +596,7 @@ AC_ARG_WITH(jansson,
      AC_CHECK_LIB([jansson], [json_loads],
       jansson=1))])
 AM_CONDITIONAL(HAVE_JANSSON, [test "$jansson" = 1])
+AM_CONDITIONAL(HAVE_JSON, [test x$jansson = x1])
 AS_IF([test "x$jansson" = x1],
       [AC_DEFINE([HAVE_JANSSON],[1],[Have jansson library])],
       [AC_DEFINE([HAVE_JANSSON],[0],[Lacking jansson library])])
@@ -1432,6 +1466,7 @@ AM_CONDITIONAL(HAVE_GNUTLS_DANE, test x$gnutls_dane = x1)
 AC_DEFINE_UNQUOTED([HAVE_GNUTLS_DANE], $gnutls_dane, [We have GnuTLS with DANE support])
 
 
+
 # Test if we are building for superMUC
 AC_MSG_CHECKING(if GNUnet is being configured to run on the SuperMUC)
 AC_ARG_ENABLE([supermuc],
@@ -1938,6 +1973,10 @@ AS_IF([test x$gnutls != xtrue],
  [AS_IF([test "x$gnutls_dane" != "x1"],
   [AC_MSG_NOTICE([WARNING: GnuTLS has no DANE support, DANE validation will not be possible])])])
 
+# warn user if libzbar is not found
+AS_IF([test "$have_zbar" = 0],
+      [AC_MSG_NOTICE([WARNING: zbar not found, gnunet-qr will not be built.])])
+
 # java ports
 AS_IF([test "x$enable_java_ports" = "xyes"],
       [AC_MSG_NOTICE([NOTICE: Opening ports for gnunet-java bindings by default.])])

+ 122 - 1
contrib/guix/gnu/packages/gnunet.scm

@@ -43,6 +43,7 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages gstreamer)
+  #:use-module (gnu packages imagemagick)
   #:use-module (gnu packages libidn)
   #:use-module (gnu packages linux)
   #:use-module (gnu packages image)
@@ -56,11 +57,14 @@
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pulseaudio)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages qt)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages video)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xiph)
+  #:use-module (gnu packages xml)
+  #:use-module (gnu packages xorg)
   #:use-module (gnu packages backup)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module ((guix build utils) #:prefix build-utils:)
@@ -191,6 +195,122 @@ authentication and support for SSL3 and TLS.")
    (license license:lgpl2.1+)
    (home-page "https://www.gnu.org/software/libmicrohttpd/")))
 
+(define-public zbar
+  (package
+   (name "zbar")
+   (version "0.22")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "https://www.linuxtv.org/downloads/zbar/zbar-"
+                                version ".tar.bz2"))
+            (sha256
+             (base32
+              "1dsffj42gbasfq4sfhgirmi3lfgdygfspwzr00wbva0pf96fka8v"))))
+   (build-system gnu-build-system)
+   (outputs '("out" "gtk" "qt"))
+   (native-inputs
+    `(;;("coreutils" ,coreutils)
+      ("dbus" ,dbus)
+      ("glib:bin", glib "bin")
+      ("pkg-config" ,pkg-config)
+      ;; for testing
+      ("perl" ,perl)
+      ("python2" ,python-2.7)
+      ))
+   (inputs
+    `(("gtk+-2" ,gtk+-2)
+      ("imagemagick" ,imagemagick)
+      ("libjpeg" ,libjpeg)
+      ("libxv" ,libxv)
+      ;;("python2-pygtk" ,python2-pygtk)
+      ("qtbase" ,qtbase)
+      ("qt11extras" ,qtx11extras)
+      ("v4l-utils" ,v4l-utils)
+      ("xmlto" ,xmlto)))
+   (arguments
+    `(#:configure-flags
+      (list "--without-python2"
+	    "--without-java"
+	    (string-append
+	     "--with-dbusconfdir=" (assoc-ref %outputs "out") "/etc")
+	    "CXXFLAGS=-std=gnu++11" ;; for qt related
+	    ;; Add the other outputs lib directories to the RUNPATH.
+	    ;; (string-append "LDFLAGS="
+	    ;; 		   "-Wl,-rpath=" (assoc-ref %outputs "gtk") "/lib"
+	    ;; 		   " "
+	    ;; 		   "-Wl,-rpath=" (assoc-ref %outputs "qt") "/lib"
+	    ;; 		   )
+	    )
+      #:tests? #f
+      #:validate-runpath? #f
+      #:phases
+      (modify-phases %standard-phases
+        (add-before 'configure 'create-missing-file
+	  ;; Create a file missing in the distribution archive,
+	  ;; see https://github.com/mchehab/zbar/issues/35
+	  (lambda _
+	    (with-output-to-file "examples/sha1sum"
+	      (lambda _
+		(display "
+a56811d078ea5cfac9be5deb4b6796177763e152  zbarimg codabar.png
+cc53bf34878f769fc3611020c11e572f2853bd2a  zbarimg code-128.png
+7537d593ea42393a43bc0eda0a896c0e31017dd8  zbarimg code-39.png
+f8f55b828eb7d0400f300be021d29293bd4a3191  zbarimg code-93.png
+aebbdbed0b32d7fd72f1245e3fb384822d492062  zbarimg databar.png
+9e245874d3229a575eabfdba1c668369c55960e3  zbarimg databar-exp.png
+53429fc04dfcf674349e2db6cfbaf73e301fc3dc  zbarimg ean-13.png
+4095418b74efbb026dd730543558fefdda46f5b9  zbarimg ean-8.png
+5501245dbba21c153f690787fc97ab50c973b846  zbarimg i2-5.png
+b350ca7efad7a50c5ac082d5c683a8e8d8d380a7  zbarimg qr-code.png
+84c0ce7072e2227073dc8bd1e5f4518d8f42ae3d  zbarimg sqcode1-generated.png
+84c0ce7072e2227073dc8bd1e5f4518d8f42ae3d  zbarimg sqcode1-scanned.png
+5ab2b518e2c9d827cedc5825d2e3c9646d43713a  zbarimg -Sean2.enable ean-2.png
+668fef8cb9caac34df8cb8564c2cde62e4af5e65  zbarimg -Sean5.enable ean-5.png
+b567e550216fe24f7652f683146365a9fe7ee867  zbarimg -Sisbn10.enable ean-13.png
+d0f37aa076d42c270f7231c5490beea5605e2ba0  zbarimg -Sisbn13.enable ean-13.png
+3f041225df3b8364b5fd0daf9cf402e8a4731f9b  zbarimg -Supca.enable code-upc-a.png
+b350ca7efad7a50c5ac082d5c683a8e8d8d380a7  zbarimg -Stest-inverted qr-code-inverted.png\n")))))
+        (replace 'check
+	  ;; Run test-suite under a dbus session.
+	  (lambda _
+	    ;; Don't fail on missing  '/etc/machine-id'.
+	    (setenv "DBUS_FATAL_WARNINGS" "0")
+	    (invoke "dbus-launch" "make" "check")))
+        (add-after 'install 'split
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            ;; Split the binaries to the various outputs.
+            (let* ((out (assoc-ref outputs "out"))
+                   (gtk (assoc-ref outputs "gtk"))
+                   (qt  (assoc-ref outputs "qt"))
+		   (mv (lambda (dest-out dir pattern)
+			 (mkdir-p (string-append dest-out dir))
+			 (for-each
+			  (lambda (file)
+			    (rename-file
+			     file
+			     (string-append dest-out dir "/" (basename file))))
+			  (find-files (string-append out dir) pattern)))))
+	      (mv qt  "/bin" "zbarcam-qt")
+	      (mv gtk "/bin" "zbarcam-gtk")
+	      (mv qt  "/lib" "libzbarqt\\..*")
+	      (mv gtk "/lib" "libzbargtk\\..*")
+	      (mv qt  "/lib/pkgconfig" "zbar-qt\\.pc" )
+	      (mv gtk "/lib/pkgconfig" "zbar-gtk\\.pc" )
+	      (mv qt  "/include/zbar" "QZBar.*\\.h")
+	      (mv gtk "/include/zbar" "zbargtk\\.h"))
+	    #t)))))
+   (synopsis "Read bar-codes from various sources")
+   (description "ZBar is a software suite for reading bar codes from
+various sources, such as video streams, image files and raw intensity
+sensors. It supports EAN-13/UPC-A, UPC-E, EAN-8, Code 128, Code 39,
+Interleaved 2 of 5 and QR Code. Included with the library are basic
+applications for decoding captured bar code images and using a video
+device (eg, webcam) as a bar code scanner. For application developers,
+language bindings are included for C, C++ and Perl as well as
+GUI widgets for Qt and GTK")
+   (license license:lgpl2.1+)
+   (home-page "http://zbar.sourceforge.net/")))
+
 (define-public gnurl
   (package
    (name "gnurl")
@@ -301,7 +421,8 @@ newspace."
       ("bluez" ,bluez) ; gnunet-transport
       ("glib" ,glib)
       ("libogg" ,libogg) ; gnunet-conversation
-      ("python-2" ,python-2))) ; tests, gnunet-qr
+      ("zbar" ,zbar) ; gnunet-qr
+      ("python-2" ,python-2))) ; tests
    (native-inputs
     `(("pkg-config" ,pkg-config)
       ("autoconf" ,autoconf)

+ 1 - 1
contrib/vagrant/bootstrap.ubuntu.sh

@@ -27,7 +27,7 @@ apt-get -y install zlib1g-dev
 # optional for gnunet-conversation
 # apt-get -y install libpulse-dev libopus-dev libogg-dev gstreamer1.0
 # optional for gnunet-qr
-apt-get -y install python-zbar
+apt-get -y install libzbar-dev
 # optional for experimental code
 apt-get -y install libglpk-dev
 #

+ 2 - 2
doc/system_specific/FROM_SOURCE

@@ -534,7 +534,7 @@ at all.
 We begin by installing a few Debian packages from stable:@
 
 @example
-# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
+# apt-get install gcc make libzbar-dev libltdl-dev libsqlite3-dev \
   libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev \
   texlive libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev \
   libbz2-dev libexiv2-dev libflac-dev libgif-dev libglib2.0-dev \
@@ -778,7 +778,7 @@ as a normal user.
 We begin by installing a few Debian packages from stable:
 
 @example
-# apt-get install gcc make python-zbar libltdl-dev libsqlite3-dev \
+# apt-get install gcc make libzbar-dev libltdl-dev libsqlite3-dev \
 libunistring-dev libopus-dev libpulse-dev openssl libglpk-dev texlive \
 libidn11-dev libmysqlclient-dev libpq-dev libarchive-dev libbz2-dev \
 libflac-dev libgif-dev libglib2.0-dev libgtk-3-dev libmpeg2-4-dev \

+ 1 - 0
po/POTFILES.in

@@ -480,6 +480,7 @@ src/util/gnunet-config.c
 src/util/gnunet-config-diff.c
 src/util/gnunet-ecc.c
 src/util/gnunet-helper-w32-console.c
+src/util/gnunet-qr.c
 src/util/gnunet-resolver.c
 src/util/gnunet-scrypt.c
 src/util/gnunet-service-resolver.c

+ 14 - 18
src/util/Makefile.am

@@ -204,26 +204,15 @@ libexec_PROGRAMS = \
  gnunet-timeout \
  $(W32CONSOLEHELPER)
 
-do_subst = $(SED) -e 's,[@]PREFIX[@],$(prefix),g'
-
-gnunet-qr: gnunet-qr.in Makefile
-	$(do_subst) < $(srcdir)/gnunet-qr.in > gnunet-qr
-	chmod +x gnunet-qr
-
-CLEANFILES = gnunet-qr
-
-pkgdata_DATA = \
-  gnunet-qr.py
-
-bin_SCRIPTS =\
- gnunet-qr
-
 bin_PROGRAMS = \
  gnunet-resolver \
  gnunet-config \
  $(GNUNET_ECC) \
  $(GNUNET_SCRYPT) \
  gnunet-uri
+if HAVE_ZBAR
+bin_PROGRAMS += gnunet-qr
+endif
 
 noinst_PROGRAMS = \
  gnunet-config-diff \
@@ -283,13 +272,22 @@ gnunet_config_LDADD = \
   libgnunetutil.la \
   $(GN_LIBINTL)
 
-
 gnunet_uri_SOURCES = \
  gnunet-uri.c
 gnunet_uri_LDADD = \
   libgnunetutil.la \
   $(GN_LIBINTL)
 
+
+gnunet_qr_SOURCES = \
+  gnunet-qr.c \
+  gnunet-qr-utils.h
+gnunet_qr_LDADD = \
+  libgnunetutil.la \
+  $(GN_LIBINTL)
+gnunet_qr_LDFLAGS= $(libzbar_LIBS)
+gnunet_qr_CFLAGS = $(libzbar_CFLAGS) -DBINDIR=\"@bindir@/\"
+
 plugin_LTLIBRARIES = \
   libgnunet_plugin_test.la
 
@@ -670,6 +668,4 @@ EXTRA_DIST = \
   test_program_data.conf \
   test_resolver_api_data.conf \
   test_service_data.conf \
-  test_speedup_data.conf \
-  gnunet-qr.in \
-  gnunet-qr.py
+  test_speedup_data.conf

+ 314 - 0
src/util/gnunet-qr.c

@@ -0,0 +1,314 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2013-2019 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
+     by the Free Software Foundation, either version 3 of the License,
+     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
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+*/
+/**
+ * @file util/gnunet-qr.c
+ * @author Hartmut Goebel (original implementation)
+ * @author Martin Schanzenbach (integrate gnunet-uri)
+ * @author Christian Grothoff (error handling)
+ */
+#include <stdio.h>
+#include <zbar.h>
+#include <stdbool.h>
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+#define LOG(fmt, ...) if (verbose == true) printf(fmt, ## __VA_ARGS__)
+
+/**
+ * Video device to capture from. Sane default for GNU/Linux systems.
+ */
+static char* device = "/dev/video0";
+
+/**
+ * --verbose option
+ */
+static int verbose = false;
+
+/**
+ * --silent option
+ */
+static int silent = false;
+
+/**
+ * Handler exit code
+ */
+static long unsigned int exit_code = 1;
+
+/**
+ * Helper process we started.
+ */
+static struct GNUNET_OS_Process *p;
+
+
+/**
+ * Pipe used to communicate child death 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
+ */
+static void
+maint_child_death (void *cls)
+{
+  enum GNUNET_OS_ProcessStatusType type;
+
+  if ( (GNUNET_OK !=
+	GNUNET_OS_process_status (p, &type, &exit_code)) ||
+       (type != GNUNET_OS_PROCESS_EXITED) )
+    GNUNET_break (0 == GNUNET_OS_process_kill (p, GNUNET_TERM_SIG));
+  GNUNET_OS_process_destroy (p);
+}
+
+
+/**
+ * Dispatch URIs to the appropriate GNUnet helper process
+ *
+ * @param cls closure
+ * @param uri uri to dispatch
+ * @param cfgfile name of the configuration file used (for saving, can be NULL!)
+ * @param cfg configuration
+ */
+static void
+gnunet_uri (void *cls,
+            const char *uri,
+            const char *cfgfile,
+            const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  const char *orig_uri;
+  const char *slash;
+  char *subsystem;
+  char *program;
+  struct GNUNET_SCHEDULER_Task * rt;
+
+  orig_uri = uri;
+  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);
+    GNUNET_free (subsystem);
+    return;
+  }
+  GNUNET_free (subsystem);
+  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, 0,
+			       NULL, NULL, NULL,
+			       program,
+			       program,
+			       orig_uri,
+			       NULL);
+  GNUNET_free (program);
+  if (NULL == p)
+    GNUNET_SCHEDULER_cancel (rt);
+}
+
+
+/**
+ * Obtain QR code 'symbol' from @a proc.
+ *
+ * @param proc zbar processor to use
+ * @return NULL on error
+ */
+static const zbar_symbol_t *
+get_symbol (zbar_processor_t *proc)
+{
+  const zbar_symbol_set_t* symbols;
+  int rc;
+  int n;
+
+  if (0 !=
+      zbar_processor_parse_config (proc, "enable"))
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  /* initialize the Processor */
+  if (0 !=
+      (rc = zbar_processor_init(proc, device, 1)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to open device `%s': %d\n",
+                device,
+                rc);
+    return NULL;
+  }
+
+  /* enable the preview window */
+  if ( (0 != (rc = zbar_processor_set_visible (proc, 1))) ||
+       (0 != (rc = zbar_processor_set_active(proc, 1))) )
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  /* read at least one barcode (or until window closed) */
+  LOG ("Capturing\n");
+  n = zbar_process_one (proc, -1);
+
+  /* hide the preview window */
+  (void) zbar_processor_set_active (proc, 0);
+  (void) zbar_processor_set_visible (proc, 0);
+  if (-1 == n)
+    return NULL; /* likely user closed the window */
+  LOG ("Got %i images\n",
+       n);
+  /* extract results */
+  symbols = zbar_processor_get_results (proc);
+  if (NULL == symbols)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+  return zbar_symbol_set_first_symbol (symbols);
+}
+
+
+/**
+ * Run zbar QR code parser.
+ *
+ * @return NULL on error, otherwise the URI that we found
+ */
+static char *
+run_zbar ()
+{
+  zbar_processor_t *proc;
+  const char *data;
+  char *ret;
+  const zbar_symbol_t* symbol;
+
+  /* configure the Processor */
+  proc = zbar_processor_create (1);
+  if (NULL == proc)
+  {
+    GNUNET_break (0);
+    return NULL;
+  }
+
+  symbol = get_symbol (proc);
+  if (NULL == symbol)
+  {
+    zbar_processor_destroy (proc);
+    return NULL;
+  }
+  data = zbar_symbol_get_data (symbol);
+  if (NULL == data)
+  {
+    GNUNET_break (0);
+    zbar_processor_destroy (proc);
+    return NULL;
+  }
+  LOG ("Found %s \"%s\"\n",
+       zbar_get_symbol_name (zbar_symbol_get_type(symbol)),
+       data);
+  ret = GNUNET_strdup (data);
+  /* clean up */
+  zbar_processor_destroy(proc);
+  return ret;
+}
+
+
+/**
+ * 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)
+{
+  char *data;
+
+  data = run_zbar ();
+  if (NULL == data)
+    return;
+  gnunet_uri (cls,
+              data,
+              cfgfile,
+              cfg);
+  if (exit_code != 0)
+  {
+    printf ("Failed to add URI %s\n",
+            data);
+  }
+  else
+  {
+    printf ("Added URI %s\n",
+            data);
+  }
+  GNUNET_free (data);
+};
+
+
+int
+main (int argc, char *const *argv)
+{
+  int ret;
+  struct GNUNET_GETOPT_CommandLineOption options[] = {
+    GNUNET_GETOPT_option_string ('d', "device", "DEVICE",
+     gettext_noop ("use video-device DEVICE (default: /dev/video0"),
+     &device),
+    GNUNET_GETOPT_option_flag ('\0', "verbose",
+     gettext_noop ("be verbose"),
+     &verbose),
+    GNUNET_GETOPT_option_flag ('s', "silent",
+     gettext_noop ("do not show preview windows"),
+			       &silent),
+    GNUNET_GETOPT_OPTION_END
+  };
+
+  ret = GNUNET_PROGRAM_run (argc,
+			    argv,
+			    "gnunet-qr",
+			    gettext_noop ("Scan a QR code using a video device and import the uri read"),
+			    options, &run, NULL);
+  return ((GNUNET_OK == ret) && (0 == exit_code)) ? 0 : 1;
+}

+ 0 - 46
src/util/gnunet-qr.in

@@ -1,46 +0,0 @@
-#!/bin/sh
-#
-# From curl's buildconf, making this script subject to the
-# curl license: https://curl.haxx.se/docs/copyright.html
-# Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
-# Copyright (C) 2019 GNUnet e.V.
-
-# findtool works like which without relying on which (which is a problem
-# for some limited shells.
-findtool(){
-  file="$1"
-
-  if { echo "$file" | grep "/" >/dev/null 2>&1; } then
-    # when file is given with a path check it first
-    if test -f "$file"; then
-      echo "$file"
-      return
-    fi
-  fi
-
-  old_IFS=$IFS; IFS=':'
-  for path in $PATH
-  do
-    IFS=$old_IFS
-    # echo "checks for $file in $path" >&2
-    if test "$path" -a "$path" != '.' -a -f "$path/$file"; then
-      echo "$path/$file"
-      return
-    fi
-  done
-  IFS=$old_IFS
-}
-
-# end curl licensed code
-pythonize=`findtool python2.7 2>/dev/null`
-if test ! -x "$pythonize"; then
-	pythonize=`findtool ${PYTHON2:-python2.7}`
-fi
-
-if test -z "$pythonize"; then
-  echo "ERROR: python2.7 not found."
-  echo "  You need python2.7 installed."
-  exit 1
-fi
-
-${pythonize} @PREFIX@/share/gnunet/gnunet-qr.py $@

+ 0 - 110
src/util/gnunet-qr.py

@@ -1,110 +0,0 @@
-import sys
-import getopt
-import subprocess
-from sys import argv
-try:
-    import zbar
-except ImportError as e:
-    print('Cannot run gnunet-qr, please install the zbar module.')
-    print('For Debian, you can obtain it as "python-zbar".')
-    print('Upstream: http://zbar.sourceforge.net/')
-    sys.exit(1)
-
-
-def help():
-    print('gnunet-qr\n\
-Scan a QR code using a video device and import\n\
-Arguments mandatory for long options are also mandatory for short options.\n\
-  -c, --config FILENAME      use configuration file FILENAME\n\
-  -d, --device DEVICE        use device DEVICE\n\
-  -s, --silent               do not show preview windows\n\
-  -h, --help                 print this help\n\
-  -v, --verbose              be verbose\n\
-Report bugs to gnunet-developers@gnu.org.\n\
-GNUnet home page: https://gnunet.org/\n\
-General help using GNU software: https://www.gnu.org/gethelp/')
-
-
-if __name__ == '__main__':
-    configuration = ''
-    device = '/dev/video0'
-    url = ''
-    verbose = False
-    silent = False
-    # Parse arguments
-    try:
-        opts, args = getopt.gnu_getopt(sys.argv[1:], "c:hd:sv", ["config", "help", "device", "silent", "verbose"])
-    except getopt.GetoptError as e:
-        help()
-        print(str(e))
-        exit(1)
-    for o, a in opts:
-        if o in ("-h", "--help"):
-            help()
-            sys.exit(0)
-        elif o in ("-c", "--config"):
-            configuration = a
-        elif o in ("-d", "--device"):
-            device = a
-        elif o in ("-s", "--silent"):
-            silent = True
-        elif o in ("-v", "--verbose"):
-            verbose = True
-    if (True == verbose):
-        print('Initializing')
-    # create a Processor
-    proc = zbar.Processor()
-
-    # configure the Processor
-    proc.parse_config('enable')
-
-    # initialize the Processor
-    try:
-        if (True == verbose):
-            print('Opening video device ' + device)
-        proc.init(device)
-    except Exception as e:
-        print('Failed to open device ' + device)
-        exit(1)
-
-    # enable the preview window
-    # if (True == silent):
-    #       proc.visible = True
-    # else:
-    #               proc.visible = False
-
-    proc.visible = True
-    # read at least one barcode (or until window closed)
-    try:
-        if (True == verbose):
-            print('Capturing')
-        proc.process_one()
-    except Exception as e:
-        # Window was closed without finding code
-        exit(1)
-
-    # hide the preview window
-    proc.visible = False
-
-    # extract results
-    for symbol in proc.results:
-        # do something useful with results
-        if (True == verbose):
-            print('Found ', symbol.type, ' symbol ', '"%s"' % symbol.data)
-        args = list()
-        args.append("gnunet-uri")
-        if (configuration != ''):
-            args.append(str("-c " + str(configuration)))
-        args.append(str(symbol.data))
-        cmd = ''
-        for a in args:
-            cmd += " " + str(a)
-        if (verbose):
-            print('Running `' + cmd +'`')
-        res = subprocess.call(args)
-        if (0 != res):
-            print('Failed to add URI ' + str(symbol.data))
-        else:
-            print('Added URI ' + str(symbol.data))
-        exit(res)
-    exit(1)