From a608666d74f156819cecfabaf72290726d7964e6 Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Mon, 18 Feb 2019 03:50:22 +0100 Subject: [PATCH] gnu: Add xsane. * gnu/packages/scanner.scm (xsane): New public variable. --- .../patches/xsane-fix-memory-leak.patch | 34 ++++ .../patches/xsane-fix-pdf-floats.patch | 85 ++++++++++ gnu/packages/patches/xsane-support-ipv6.patch | 153 ++++++++++++++++++ .../patches/xsane-tighten-default-umask.patch | 36 +++++ gnu/packages/scanner.scm | 88 ++++++++++ 5 files changed, 396 insertions(+) create mode 100644 gnu/packages/patches/xsane-fix-memory-leak.patch create mode 100644 gnu/packages/patches/xsane-fix-pdf-floats.patch create mode 100644 gnu/packages/patches/xsane-support-ipv6.patch create mode 100644 gnu/packages/patches/xsane-tighten-default-umask.patch diff --git a/gnu/packages/patches/xsane-fix-memory-leak.patch b/gnu/packages/patches/xsane-fix-memory-leak.patch new file mode 100644 index 0000000000..4e03e57e13 --- /dev/null +++ b/gnu/packages/patches/xsane-fix-memory-leak.patch @@ -0,0 +1,34 @@ +From bbd54510f0297afa2d1a81927db060cb0b791f14 Mon Sep 17 00:00:00 2001 +From: Ralph Little +Date: Sun, 1 Sep 2019 17:34:19 -0700 +Subject: [PATCH] Apply opensuse upstream patch xsane_memory_leak + +Removes completely redundant memory allocation. +--- + src/xsane-batch-scan.c | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/src/xsane-batch-scan.c b/src/xsane-batch-scan.c +index 90cc0e0..e77caca 100644 +--- a/src/xsane-batch-scan.c ++++ b/src/xsane-batch-scan.c +@@ -680,7 +680,6 @@ static GtkWidget *xsane_batch_scan_create_list_entry(Batch_Scan_Parameters *para + GtkWidget *list_item; + GtkWidget *hbox; + int size = 120; +- char *data; + + list_item = gtk_list_item_new(); + +@@ -688,8 +687,6 @@ static GtkWidget *xsane_batch_scan_create_list_entry(Batch_Scan_Parameters *para + gtk_container_add(GTK_CONTAINER(list_item), hbox); + gtk_widget_show(hbox); + +- data = calloc(size, size); +- + parameters->gtk_preview = gtk_preview_new(GTK_PREVIEW_COLOR); + gtk_preview_size(GTK_PREVIEW(parameters->gtk_preview), size, size); + gtk_box_pack_start(GTK_BOX(hbox), parameters->gtk_preview, FALSE, FALSE, 0); +-- +2.22.0 + diff --git a/gnu/packages/patches/xsane-fix-pdf-floats.patch b/gnu/packages/patches/xsane-fix-pdf-floats.patch new file mode 100644 index 0000000000..5f26fa140b --- /dev/null +++ b/gnu/packages/patches/xsane-fix-pdf-floats.patch @@ -0,0 +1,85 @@ +From c126eea11c4ee39cbe9c0c76f920626b618b6ee9 Mon Sep 17 00:00:00 2001 +From: Ralph Little +Date: Sun, 1 Sep 2019 17:03:44 -0700 +Subject: [PATCH] Apply debian upstream patch 0135-fix_pdf_floats + +Original patch commentary: + +Description: Fix floats in PDF and PostScript + Set LC_NUMERIC to POSIX before printing floats when building + PostScript or PDF output. +Author: Julien BLACHE +Forwarded: yes + +------------ +Looks like float printing format is affected by the current locale. +Ensures that we always get POSIX formatting of floats. +--- + src/xsane-save.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/src/xsane-save.c b/src/xsane-save.c +index f14df05..63550cc 100644 +--- a/src/xsane-save.c ++++ b/src/xsane-save.c +@@ -26,6 +26,8 @@ + #include "xsane-back-gtk.h" + #include "xsane-front-gtk.h" + #include "xsane-save.h" ++#include ++#include + #include + #include + +@@ -2425,6 +2427,7 @@ static void xsane_save_ps_create_image_header(FILE *outfile, + int flatedecode) + { + int depth; ++ char *save_locale; + + depth = image_info->depth; + +@@ -2442,8 +2445,15 @@ static void xsane_save_ps_create_image_header(FILE *outfile, + + fprintf(outfile, "%d rotate\n", degree); + fprintf(outfile, "%d %d translate\n", position_left, position_bottom); ++ ++ save_locale = strdup(setlocale(LC_NUMERIC, NULL)); ++ setlocale(LC_NUMERIC, "POSIX"); ++ + fprintf(outfile, "%f %f scale\n", width, height); + ++ setlocale(LC_NUMERIC, save_locale); ++ free(save_locale); ++ + fprintf(outfile, "<<\n"); + fprintf(outfile, " /ImageType 1\n"); + fprintf(outfile, " /Width %d\n", image_info->image_width); +@@ -3921,6 +3931,7 @@ static void xsane_save_pdf_create_page_header(FILE *outfile, struct pdf_xref *xr + int position_left, position_bottom, box_left, box_bottom, box_right, box_top, depth; + int left, bottom; + float rad; ++ char *save_locale; + + DBG(DBG_proc, "xsane_save_pdf_create_page_header\n"); + +@@ -4035,8 +4046,16 @@ static void xsane_save_pdf_create_page_header(FILE *outfile, struct pdf_xref *xr + + fprintf(outfile, "q\n"); + fprintf(outfile, "1 0 0 1 %d %d cm\n", position_left, position_bottom); /* translate */ ++ ++ save_locale = strdup(setlocale(LC_NUMERIC, NULL)); ++ setlocale(LC_NUMERIC, "POSIX"); ++ + fprintf(outfile, "%f %f -%f %f 0 0 cm\n", cos(rad), sin(rad), sin(rad), cos(rad)); /* rotate */ + fprintf(outfile, "%f 0 0 %f 0 0 cm\n", width, height); /* scale */ ++ ++ setlocale(LC_NUMERIC, save_locale); ++ free(save_locale); ++ + fprintf(outfile, "BI\n"); + fprintf(outfile, " /W %d\n", image_info->image_width); + fprintf(outfile, " /H %d\n", image_info->image_height); +-- +2.22.0 + diff --git a/gnu/packages/patches/xsane-support-ipv6.patch b/gnu/packages/patches/xsane-support-ipv6.patch new file mode 100644 index 0000000000..4e3bb87a1a --- /dev/null +++ b/gnu/packages/patches/xsane-support-ipv6.patch @@ -0,0 +1,153 @@ +From 62d9c172f258769e3a7540fe710e013bb39a704f Mon Sep 17 00:00:00 2001 +From: Ralph Little +Date: Sat, 7 Sep 2019 12:39:45 -0700 +Subject: [PATCH] Apply opensuse upstream patch 004-ipv6-support + +Appears to be related to this: +https://bugzilla.redhat.com/show_bug.cgi?id=198422 + +----- +Changes email socket connection code to use more IP version agnostic +calls. It appears to only be used by the scan email option and +originally comes from the RedHat IPv6 awareness program mentioned +in the bug report. + +In practice, I'm not sure how practical the implementation for emailing +scans in xsane is as it does not look to support encryption, pretty +much a given in today's world. +--- + src/xsane-save.c | 96 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 62 insertions(+), 34 deletions(-) + +diff --git a/src/xsane-save.c b/src/xsane-save.c +index 63550cc..ff3c459 100644 +--- a/src/xsane-save.c ++++ b/src/xsane-save.c +@@ -31,6 +31,8 @@ + #include + #include + ++#include ++ + /* the following test is always false */ + #ifdef _native_WIN32 + # include +@@ -7540,55 +7542,81 @@ void write_email_attach_file(int fd_socket, char *boundary, FILE *infile, char * + /* returns fd_socket if sucessfull, < 0 when error occured */ + int open_socket(char *server, int port) + { +- int fd_socket; +- struct sockaddr_in sin; +- struct hostent *he; ++ int fd_socket, e; ++ ++ struct addrinfo *ai_list, *ai; ++ struct addrinfo hints; ++ gchar *port_s; ++ gint connected; ++ ++ memset(&hints, '\0', sizeof(hints)); ++ hints.ai_flags = AI_ADDRCONFIG; ++ hints.ai_socktype = SOCK_STREAM; ++ ++ port_s = g_strdup_printf("%d", port); ++ e = getaddrinfo(server, port_s, &hints, &ai_list); ++ g_free(port_s); + +- he = gethostbyname(server); +- if (!he) ++ if (e != 0) + { +- DBG(DBG_error, "open_socket: Could not get hostname of \"%s\"\n", server); ++ DBG(DBG_error, "open_socket: Could not lookup \"%s\"\n", server); + return -1; + } +- else ++ ++ connected = 0; ++ for (ai = ai_list; ai != NULL && !connected; ai = ai->ai_next) + { +- DBG(DBG_info, "open_socket: connecting to \"%s\" = %d.%d.%d.%d\n", +- he->h_name, +- (unsigned char) he->h_addr_list[0][0], +- (unsigned char) he->h_addr_list[0][1], +- (unsigned char) he->h_addr_list[0][2], +- (unsigned char) he->h_addr_list[0][3]); +- } ++ gchar hostname[NI_MAXHOST]; ++ gchar hostaddr[NI_MAXHOST]; ++ ++ /* If all else fails */ ++ strncpy(hostname, "(unknown name)", NI_MAXHOST-1); ++ strncpy(hostaddr, "(unknown address)", NI_MAXHOST-1); ++ ++ /* Determine canonical name and IPv4/IPv6 address */ ++ (void) getnameinfo(ai->ai_addr, ai->ai_addrlen, hostname, sizeof(hostname), ++ NULL, 0, 0); ++ (void) getnameinfo(ai->ai_addr, ai->ai_addrlen, hostaddr, sizeof(hostaddr), ++ NULL, 0, NI_NUMERICHOST); ++ ++ DBG(DBG_info, "open_socket: connecting to \"%s\" (\"%s\"): %s\n", ++ server, hostname, hostaddr); + +- if (he->h_addrtype != AF_INET) +- { +- DBG(DBG_error, "open_socket: Unknown address family: %d\n", he->h_addrtype); +- return -1; +- } ++ if ((ai->ai_family != AF_INET) && (ai->ai_family != AF_INET6)) ++ { ++ DBG(DBG_error, "open_socket: Unknown address family: %d\n", ai->ai_family); ++ continue; ++ } + +- fd_socket = socket(AF_INET, SOCK_STREAM, 0); ++ fd_socket = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + +- if (fd_socket < 0) +- { +- DBG(DBG_error, "open_socket: Could not create socket: %s\n", strerror(errno)); +- return -1; +- } ++ if (fd_socket < 0) ++ { ++ DBG(DBG_error, "open_socket: Could not create socket: %s\n", strerror(errno)); ++ continue; ++ } + +-/* setsockopt (dev->ctl, level, TCP_NODELAY, &on, sizeof (on)); */ ++ /* setsockopt (dev->ctl, level, TCP_NODELAY, &on, sizeof (on)); */ + +- sin.sin_port = htons(port); +- sin.sin_family = AF_INET; +- memcpy(&sin.sin_addr, he->h_addr_list[0], he->h_length); ++ if (connect(fd_socket, ai->ai_addr, ai->ai_addrlen) != 0) ++ { ++ DBG(DBG_error, "open_socket: Could not connect with port %d of socket: %s\n", port, strerror(errno)); ++ continue; ++ } ++ ++ /* All went well */ ++ connected = 1; ++ } + +- if (connect(fd_socket, &sin, sizeof(sin))) ++ if (!connected) + { +- DBG(DBG_error, "open_socket: Could not connect with port %d of socket: %s\n", ntohs(sin.sin_port), strerror(errno)); +- return -1; ++ DBG(DBG_info, "open_socket: Could not connect to any address"); ++ return -1; + } + +- DBG(DBG_info, "open_socket: Connected with port %d\n", ntohs(sin.sin_port)); ++ DBG(DBG_info, "open_socket: Connected with port %d\n", port); + +- return fd_socket; ++ return fd_socket; + } + + /* ---------------------------------------------------------------------------------------------------------------------- */ +-- +2.22.0 + diff --git a/gnu/packages/patches/xsane-tighten-default-umask.patch b/gnu/packages/patches/xsane-tighten-default-umask.patch new file mode 100644 index 0000000000..5ee5fdfd37 --- /dev/null +++ b/gnu/packages/patches/xsane-tighten-default-umask.patch @@ -0,0 +1,36 @@ +From 5dc1e301a165709c60c435f00ec9bb6d7d5f21f3 Mon Sep 17 00:00:00 2001 +From: Ralph Little +Date: Tue, 27 Aug 2019 21:40:02 -0700 +Subject: [PATCH] Apply debian upstream patch 0160-fix_tighten_default_umask + +Original patch commentary: + +Description: Change default XSane umask from 0007 to 0077 + A default umask of 0007 can be mildly insecure in a multiuser environment, + so tighten things up a bit and go with 0077 instead. +Author: Adrien Thebo +Bug-Debian: http://bugs.debian.org/592972 +Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/xsane/+bug/611950 + +---- +As above. +--- + src/xsane.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/xsane.h b/src/xsane.h +index 67f06d4..fa04418 100644 +--- a/src/xsane.h ++++ b/src/xsane.h +@@ -104,7 +104,7 @@ + #define XSANE_DEBUG_ENVIRONMENT "XSANE_DEBUG" + + #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025 +-#define XSANE_DEFAULT_UMASK 0007 ++#define XSANE_DEFAULT_UMASK 0077 + #define XSANE_HOLD_TIME 200 + #define XSANE_CONTINUOUS_HOLD_TIME 10 + #define XSANE_DEFAULT_DEVICE "SANE_DEFAULT_DEVICE" +-- +2.22.0 + diff --git a/gnu/packages/scanner.scm b/gnu/packages/scanner.scm index b371cf3105..aa58b5aa50 100644 --- a/gnu/packages/scanner.scm +++ b/gnu/packages/scanner.scm @@ -21,11 +21,16 @@ ;;; along with GNU Guix. If not, see . (define-module (gnu packages scanner) + #:use-module (gnu packages) + #:use-module (gnu packages freedesktop) + #:use-module (gnu packages ghostscript) + #:use-module (gnu packages gtk) #:use-module (gnu packages image) #:use-module (gnu packages libusb) #:use-module (gnu packages pkg-config) #:use-module (guix build-system gnu) #:use-module (guix download) + #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix licence:) #:use-module (guix packages) @@ -148,3 +153,86 @@ (define out (string-append (assoc-ref outputs "out") proving access to any raster image scanner hardware (flatbed scanner, hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The package contains the library and drivers."))) + +(define-public xsane + (package + (name "xsane") + (version "0.999") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://gitlab.com/sane-project/frontend/xsane.git") + (commit version))) + (file-name (git-file-name name version)) + (sha256 + (base32 "08zvxj7i1s88ckrsqldmsrikc3g62a6p3s3i5b5x4krcfpi3vs50")) + ;; Apply some important-looking fixes. There are many more unreleased + ;; commits upstream. A 1.0 release is planned. + (patches (search-patches "xsane-fix-memory-leak.patch" + "xsane-fix-pdf-floats.patch" + "xsane-support-ipv6.patch" + "xsane-tighten-default-umask.patch")) + (modules '((guix build utils))) + (snippet + '(begin + ;; Remove ancient bundled lprng code under a non-free licence. See + ;; , which solves the problem + ;; by replacing it with a newer (free) copy. We let the build fall + ;; back to the system version instead, which appears to work fine. + (delete-file "lib/snprintf.c") + (substitute* "lib/Makefile.in" + (("snprintf\\.o ") "")) + #t)))) + (build-system gnu-build-system) + (arguments + `(#:make-flags + (list (string-append "xsanedocdir=" (assoc-ref %outputs "out") + "/share/doc/" ,name "-" ,version)) + #:tests? #f ; no test suite + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'patch-invalid-dereference + ;; Fix the following compilation error with libpng: + ;; xsane-save.c: In function ‘xsane_save_png’: + ;; xsane-save.c:4913:21: error: dereferencing pointer to + ;; incomplete type ‘png_struct {aka struct png_struct_def}’ + ;; if (setjmp(png_ptr->jmpbuf)) + ;; ^ + (lambda _ + (substitute* "src/xsane-save.c" + (("png_ptr->jmpbuf") "png_jmpbuf(png_ptr)")) + #t)) + (add-after 'unpack 'use-sane-help-browser + (lambda _ + (substitute* "src/xsane.h" + (("netscape") (which "xdg-open"))) + #t)) + (add-after 'install 'delete-empty-/sbin + (lambda* (#:key outputs #:allow-other-keys) + (let ((out (assoc-ref outputs "out"))) + (rmdir (string-append out "/sbin")) + #t)))))) + (native-inputs + `(("pkg-config" ,pkg-config))) + (inputs + `(("gtk+" ,gtk+-2) + ("lcms" ,lcms) + ("libjpeg" ,libjpeg) + ("libtiff" ,libtiff) + ("sane-backends" ,sane-backends) + + ;; To open the manual from the Help menu. + ("xdg-utils" ,xdg-utils))) + (home-page "https://gitlab.com/sane-project/frontend/xsane") + (synopsis "Featureful graphical interface for document and image scanners") + (description + "XSane is a graphical interface for controlling a scanner and acquiring +images from it. You can photocopy multi-page documents and save, fax, print, +or e-mail your scanned images. It is highly configurable and exposes all +device settings, letting you fine-tune the final result. It can also be used +as a GIMP plugin to acquire images directly from a scanner. + +XSane talks to scanners through the @acronym{SANE, Scanner Access Now Easy} +back-end library, which supports almost all existing scanners.") + (license licence:gpl2+)))