gnu: Add xsane.

* gnu/packages/scanner.scm (xsane): New public variable.
This commit is contained in:
Tobias Geerinckx-Rice 2019-02-18 03:50:22 +01:00
parent ee4db149c2
commit a608666d74
No known key found for this signature in database
GPG key ID: D889B0F018C5493C
5 changed files with 396 additions and 0 deletions

View file

@ -0,0 +1,34 @@
From bbd54510f0297afa2d1a81927db060cb0b791f14 Mon Sep 17 00:00:00 2001
From: Ralph Little <littlesincanada@yahoo.co.uk>
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

View file

@ -0,0 +1,85 @@
From c126eea11c4ee39cbe9c0c76f920626b618b6ee9 Mon Sep 17 00:00:00 2001
From: Ralph Little <littlesincanada@yahoo.co.uk>
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 <jblache@debian.org>
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 <locale.h>
+#include <string.h>
#include <time.h>
#include <sys/wait.h>
@@ -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

View file

@ -0,0 +1,153 @@
From 62d9c172f258769e3a7540fe710e013bb39a704f Mon Sep 17 00:00:00 2001
From: Ralph Little <littlesincanada@yahoo.co.uk>
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 <time.h>
#include <sys/wait.h>
+#include <glib.h>
+
/* the following test is always false */
#ifdef _native_WIN32
# include <winsock.h>
@@ -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

View file

@ -0,0 +1,36 @@
From 5dc1e301a165709c60c435f00ec9bb6d7d5f21f3 Mon Sep 17 00:00:00 2001
From: Ralph Little <littlesincanada@yahoo.co.uk>
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

View file

@ -21,11 +21,16 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(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
;; <https://trisquel.info/en/issues/10713>, 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+)))