summaryrefslogtreecommitdiff
path: root/debian/patches
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches')
-rw-r--r--debian/patches/0011-test.patch34
-rw-r--r--debian/patches/0035-trim-libraries-in-sane-backends.pc.in.patch24
-rw-r--r--debian/patches/0040-remove_git.patch12
-rw-r--r--debian/patches/0045-disable_lock_test_at_build_time.patch27
-rw-r--r--debian/patches/0050-Use-python3-shebang.patch16
-rw-r--r--debian/patches/0055-Fix_build_error.patch36
-rw-r--r--debian/patches/0060-cross.patch54
-rw-r--r--debian/patches/0100-source_spelling.patch194
-rw-r--r--debian/patches/0125-multiarch_dll_search_path.patch44
-rw-r--r--debian/patches/0140-avahi.patch90
-rw-r--r--debian/patches/0145-avahi.patch34
-rw-r--r--debian/patches/0150-i386-test.patch48
-rw-r--r--debian/patches/0155-hurd_PATH_MAX.patch364
-rw-r--r--debian/patches/0165-respect_local_only_parameter.patch768
-rw-r--r--debian/patches/0170-return_empty_list_when_local_devices_requested.patch43
-rw-r--r--debian/patches/0175-fix_tests.patch96
-rw-r--r--debian/patches/0180-gt68xx_fix_use-after-free_two_memleaks.patch55
-rw-r--r--debian/patches/0185-Change_output_from_sane-find-scanner.patch51
-rw-r--r--debian/patches/0190-remove-kernel-driver-for-plustek_pp.patch2949
-rw-r--r--debian/patches/0195-genesys_fix_total_file_size_exceeding.patch100
-rw-r--r--debian/patches/0200-disable-check-equal-stderr.patch23
-rw-r--r--debian/patches/0600-scanimage_manpage.patch21
-rw-r--r--debian/patches/0605-fix_groff-warnings.patch20
-rw-r--r--debian/patches/0705-kfreebsd.patch17
-rw-r--r--debian/patches/0725-fix_link_60-libsane_rule.patch33
-rw-r--r--debian/patches/series25
26 files changed, 5178 insertions, 0 deletions
diff --git a/debian/patches/0011-test.patch b/debian/patches/0011-test.patch
new file mode 100644
index 0000000..d4d4590
--- /dev/null
+++ b/debian/patches/0011-test.patch
@@ -0,0 +1,34 @@
+Index: trunk/frontend/jpegtopdf.c
+===================================================================
+--- trunk.orig/frontend/jpegtopdf.c
++++ trunk/frontend/jpegtopdf.c
+@@ -184,6 +184,7 @@ static SANE_Int _get_current_time( struc
+ SANE_Int ret = SANE_ERR;
+ time_t t;
+ long tz;
++ long timezone = 0;
+
+ if ( pt == NULL || sign_c == NULL || ptz_h == NULL || ptz_m == NULL ) {
+ goto EXIT;
+@@ -201,7 +202,7 @@ static SANE_Int _get_current_time( struc
+ goto EXIT;
+ }
+ /* get time difference ( OHH'mm' ) */
+- tz = timezone;
++ tz = timezone;
+ if ( tz > 0 ) {
+ *sign_c = '-';
+ }
+Index: trunk/configure.ac
+===================================================================
+--- trunk.orig/configure.ac
++++ trunk/configure.ac
+@@ -671,7 +671,7 @@ ALL_BACKENDS="abaton agfafocus apple art
+ mustek_usb mustek_usb2 nec net niash pie pieusb pint \
+ pixma plustek plustek_pp qcam ricoh ricoh2 rts8891 s9036 \
+ sceptre sharp sm3600 sm3840 snapscan sp15c st400 \
+- stv680 tamarack teco1 teco2 teco3 test u12 umax
++ stv680 tamarack teco1 teco2 teco3 test u12 umax \
+ umax_pp umax1220u v4l xerox_mfp p5"
+
+ # If user specifies backends manually then cause configure
diff --git a/debian/patches/0035-trim-libraries-in-sane-backends.pc.in.patch b/debian/patches/0035-trim-libraries-in-sane-backends.pc.in.patch
new file mode 100644
index 0000000..7452b33
--- /dev/null
+++ b/debian/patches/0035-trim-libraries-in-sane-backends.pc.in.patch
@@ -0,0 +1,24 @@
+From: Markus Koschany <apo@gambaru.de>
+Date: Sun, 30 Jun 2013 19:13:54 +0200
+Subject: trim libraries in sane-backends.pc.in
+
+Update the original sane-config_and_pkg-config_fixes.patch from Julien BLACHE.
+Patching RPATH related flags is no longer necessary. Still trim the libraries
+in sane-backends.pc.in to the bare minimum for what is needed for libsane.
+---
+ tools/sane-backends.pc.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/tools/sane-backends.pc.in
++++ b/tools/sane-backends.pc.in
+@@ -2,8 +2,8 @@
+ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+ includedir=@includedir@
+-ldflags=@LDFLAGS@ @GPHOTO2_LDFLAGS@
+-libs=@LIBS@ @DL_LIBS@ @LIBV4L_LIBS@ @MATH_LIB@ @TIFF_LIBS@ @JPEG_LIBS@ @GPHOTO2_LIBS@ @SOCKET_LIBS@ @AVAHI_LIBS@ @USB_LIBS@ @SCSI_LIBS@ @RESMGR_LIBS@
++ldflags=@LDFLAGS@
++libs=@LIBS@
+
+ Name: SANE Backends
+ Description: Backends for SANE, the universal scanner interface
diff --git a/debian/patches/0040-remove_git.patch b/debian/patches/0040-remove_git.patch
new file mode 100644
index 0000000..6cbe5f7
--- /dev/null
+++ b/debian/patches/0040-remove_git.patch
@@ -0,0 +1,12 @@
+Description: fix missing .tarball-version if git isn't used
+Author: Jörg Frings-Fürst <debian@jff.email>
+Bug: https://gitlab.com/sane-project/backends/-/issues/440
+Last-Update: 2021-02-17
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/.tarball-version
+===================================================================
+--- /dev/null
++++ trunk/.tarball-version
+@@ -0,0 +1 @@
++1.1.1-debian
diff --git a/debian/patches/0045-disable_lock_test_at_build_time.patch b/debian/patches/0045-disable_lock_test_at_build_time.patch
new file mode 100644
index 0000000..8aeccf8
--- /dev/null
+++ b/debian/patches/0045-disable_lock_test_at_build_time.patch
@@ -0,0 +1,27 @@
+Description: Disable lock test at buildtime
+Author: Jörg Frings-Fürst <debian@jff.emaill>
+Forwarded: not-needed
+Last-Update: 2020-08-28
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/acinclude.m4
+===================================================================
+--- trunk.orig/acinclude.m4
++++ trunk/acinclude.m4
+@@ -356,11 +356,11 @@ AC_DEFUN([SANE_CHECK_LOCKING],
+ touch sanetest.file
+ chgrp $LOCKPATH_GROUP sanetest.file 2>/dev/null || lasterror=$?
+ rm -f sanetest.file
+- if test ! -z "$lasterror"; then
+- AC_MSG_WARN([Group $LOCKPATH_GROUP does not exist on this system.])
+- AC_MSG_WARN([Locking feature will be disabled.])
+- use_locking=no
+- fi
++# if test ! -z "$lasterror"; then
++# AC_MSG_WARN([Group $LOCKPATH_GROUP does not exist on this system.])
++# AC_MSG_WARN([Locking feature will be disabled.])
++# use_locking=no
++# fi
+ fi
+ if test $use_locking = yes ; then
+ INSTALL_LOCKPATH=install-lockpath
diff --git a/debian/patches/0050-Use-python3-shebang.patch b/debian/patches/0050-Use-python3-shebang.patch
new file mode 100644
index 0000000..c3e85be
--- /dev/null
+++ b/debian/patches/0050-Use-python3-shebang.patch
@@ -0,0 +1,16 @@
+Description: Use python3 shebang
+Author: Jörg Frings-Fürst <debian@jff.email>
+Forwarded: not-needed
+Last-Update: 2020-08-28
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/pixma/scripts/pixma_gen_options.py
+===================================================================
+--- trunk.orig/backend/pixma/scripts/pixma_gen_options.py
++++ trunk/backend/pixma/scripts/pixma_gen_options.py
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/env python3
+
+ from __future__ import print_function
+ import sys,os,re
diff --git a/debian/patches/0055-Fix_build_error.patch b/debian/patches/0055-Fix_build_error.patch
new file mode 100644
index 0000000..b1b09b1
--- /dev/null
+++ b/debian/patches/0055-Fix_build_error.patch
@@ -0,0 +1,36 @@
+Description: Fix build error
+Author: Jörg Frings-Fürst <debian@jff.email>
+Forwarded: not-needed
+Last-Update: 2020-08-28
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/po/POTFILES.in
+===================================================================
+--- trunk.orig/po/POTFILES.in
++++ trunk/po/POTFILES.in
+@@ -65,7 +65,7 @@ backend/p5.c
+ backend/p5.h
+ backend/p5_device.c
+ backend/pixma/pixma.c
+-backend/pixma/pixma_sane_options.c
++backend/pixma/pixma_sane_options.c
+ backend/plustek.c
+ backend/plustek_pp.c
+ backend/pnm.c
+Index: trunk/backend/Makefile.am
+===================================================================
+--- trunk.orig/backend/Makefile.am
++++ trunk/backend/Makefile.am
+@@ -947,10 +947,10 @@ $(srcdir)/pixma/pixma.c: \
+
+ $(srcdir)/pixma/pixma_sane_options.h:
+ @echo Generating $@ from $(@D)/pixma.c
+- @(cd $(@D); python scripts/pixma_gen_options.py h < pixma.c > $(@F))
++ @(cd $(@D); python3 scripts/pixma_gen_options.py h < pixma.c > $(@F))
+ $(srcdir)/pixma/pixma_sane_options.c:
+ @echo Generating $@ from $(@D)/pixma.c
+- @(cd $(@D); python scripts/pixma_gen_options.py < pixma.c > $(@F))
++ @(cd $(@D); python3 scripts/pixma_gen_options.py < pixma.c > $(@F))
+
+ EXTRA_DIST += pixma/pixma_sane_options.c
+ EXTRA_DIST += pixma/pixma_sane_options.h
diff --git a/debian/patches/0060-cross.patch b/debian/patches/0060-cross.patch
new file mode 100644
index 0000000..a810929
--- /dev/null
+++ b/debian/patches/0060-cross.patch
@@ -0,0 +1,54 @@
+Description: Make gphoto2 detection use the host architecture pkg-config
+Author: Helmut Grohne <helmut@subdivi.de>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=948711
+Forwarded: not-needed
+Last-Update: 2020-08-30
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/acinclude.m4
+===================================================================
+--- trunk.orig/acinclude.m4
++++ trunk/acinclude.m4
+@@ -436,15 +436,19 @@ AC_DEFUN([SANE_CHECK_GPHOTO2],
+ # a program. And, if that works, then add the -l flags to
+ # GPHOTO2_LIBS and any other flags to GPHOTO2_LDFLAGS to pass to
+ # sane-config.
+- if test "$with_gphoto2" != "no" ; then
+- AC_CHECK_TOOL(HAVE_GPHOTO2, pkg-config, false)
++ AS_IF([test "$with_gphoto2" != "no"],[
++ AC_REQUIRE([PKG_PROG_PKG_CONFIG])
++ if test "x$PKG_CONFIG" = x; then
++ HAVE_GPHOTO2=false
++ else
++ HAVE_GPHOTO2=$PKG_CONFIG
++ fi
+
+ if test ${HAVE_GPHOTO2} != "false" ; then
+- if pkg-config --exists libgphoto2 ; then
+- with_gphoto2="`pkg-config --modversion libgphoto2`"
+- GPHOTO2_CPPFLAGS="`pkg-config --cflags libgphoto2`"
+- GPHOTO2_LIBS="`pkg-config --libs libgphoto2`"
+-
++ if $PKG_CONFIG --exists libgphoto2 ; then
++ with_gphoto2="`$PKG_CONFIG --modversion libgphoto2`"
++ GPHOTO2_CPPFLAGS="`$PKG_CONFIG --cflags libgphoto2`"
++ GPHOTO2_LIBS="`$PKG_CONFIG --libs libgphoto2`"
+ saved_CPPFLAGS="${CPPFLAGS}"
+ CPPFLAGS="${GPHOTO2_CPPFLAGS}"
+ saved_LIBS="${LIBS}"
+@@ -464,13 +468,13 @@ AC_DEFUN([SANE_CHECK_GPHOTO2],
+ GPHOTO2_LIBS=""
+ else
+ SANE_EXTRACT_LDFLAGS(GPHOTO2_LIBS, GPHOTO2_LDFLAGS)
+- if pkg-config --atleast-version=2.5.0 libgphoto2; then
++ if $PKG_CONFIG --atleast-version=2.5.0 libgphoto2; then
+ AC_DEFINE([GPLOGFUNC_NO_VARGS], [1],
+ [Define if GPLogFunc does not take a va_list.])
+ fi
+ fi
+ fi
+- fi
++ ])
+ AC_SUBST(GPHOTO2_CPPFLAGS)
+ AC_SUBST(GPHOTO2_LIBS)
+ AC_SUBST(GPHOTO2_LDFLAGS)
diff --git a/debian/patches/0100-source_spelling.patch b/debian/patches/0100-source_spelling.patch
new file mode 100644
index 0000000..6bf41f1
--- /dev/null
+++ b/debian/patches/0100-source_spelling.patch
@@ -0,0 +1,194 @@
+Description: Correct source typos
+Author: Jörg Frings-Fürst <debian@jff.email>
+Forwarded: not-needed
+Last-Update: 2022-02-04
+----
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/epsonds-jpeg.c
+===================================================================
+--- trunk.orig/backend/epsonds-jpeg.c
++++ trunk/backend/epsonds-jpeg.c
+@@ -194,7 +194,7 @@ void eds_decode_jpeg(epsonds_scanner*s,
+ }
+ }
+ }
+- DBG(10,"decodded lines = %d\n", sum);
++ DBG(10,"decoded lines = %d\n", sum);
+
+ // abandon unncessary data
+ if ((JDIMENSION)sum < jpeg_cinfo.output_height)
+Index: trunk/frontend/jpegtopdf.c
+===================================================================
+--- trunk.orig/frontend/jpegtopdf.c
++++ trunk/frontend/jpegtopdf.c
+@@ -285,7 +285,7 @@ SANE_Int sane_pdf_start_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -326,7 +326,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -346,7 +346,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -360,7 +360,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -376,7 +376,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -386,7 +386,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( _get_current_time( &tm, &sign_c, &tz_h, &tz_m ) == SANE_ERR ) {
+- fprintf ( stderr, " Error is occured in _get_current_time.\n" );
++ fprintf ( stderr, " Error is occurred in _get_current_time.\n" );
+ goto EXIT;
+ }
+ /* Dates format */
+@@ -404,7 +404,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -420,7 +420,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -434,7 +434,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+ w_count += SANE_PDF_FIRST_PAGE_ID - 1;
+@@ -450,7 +450,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+ w_count ++;
+@@ -472,7 +472,7 @@ SANE_Int sane_pdf_end_doc( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -568,7 +568,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -586,7 +586,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+ /* write Contents(2) */
+@@ -598,7 +598,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -609,7 +609,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -627,7 +627,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -648,7 +648,7 @@ SANE_Int sane_pdf_start_page(
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -680,7 +680,7 @@ SANE_Int sane_pdf_end_page( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
+@@ -698,7 +698,7 @@ SANE_Int sane_pdf_end_page( void *pw )
+ goto EXIT;
+ }
+ if ( ( ldata = re_write_if_fail( pwork->fd, str, len ) ) < 0 ) {
+- fprintf ( stderr, " Error is occured in re_write_if_fail.\n" );
++ fprintf ( stderr, " Error is occurred in re_write_if_fail.\n" );
+ goto EXIT;
+ }
+
diff --git a/debian/patches/0125-multiarch_dll_search_path.patch b/debian/patches/0125-multiarch_dll_search_path.patch
new file mode 100644
index 0000000..67b9484
--- /dev/null
+++ b/debian/patches/0125-multiarch_dll_search_path.patch
@@ -0,0 +1,44 @@
+Description: Keep /usr/lib/sane as a fallback for SANE backends
+ Make /usr/lib/arch_triplet/sane the default location for SANE backends,
+ but keep /usr/lib/sane as a fallback for now.
+Author: Julien BLACHE <jblache@debian.org>
+
+Index: trunk/backend/dll.c
+===================================================================
+--- trunk.orig/backend/dll.c
++++ trunk/backend/dll.c
+@@ -468,18 +468,18 @@ load (struct backend *be)
+
+ if (path)
+ {
+- src_len = strlen (path) + strlen (DIR_SEP) + strlen(LIBDIR) + 1;
++ src_len = strlen (path) + strlen (DIR_SEP) + strlen(DEB_DLL_LIBDIR) + 1;
+ src = malloc (src_len);
+ if (!src)
+ {
+ DBG (1, "load: malloc failed: %s\n", strerror (errno));
+ return SANE_STATUS_NO_MEM;
+ }
+- snprintf (src, src_len, "%s%s%s", path, DIR_SEP, LIBDIR);
++ snprintf (src, src_len, "%s%s%s", path, DIR_SEP, DEB_DLL_LIBDIR);
+ }
+ else
+ {
+- src = LIBDIR;
++ src = DEB_DLL_LIBDIR;
+ src = strdup (src);
+ if (!src)
+ {
+Index: trunk/backend/Makefile.am
+===================================================================
+--- trunk.orig/backend/Makefile.am
++++ trunk/backend/Makefile.am
+@@ -5,7 +5,7 @@
+ ## This file is part of the "Sane" build infra-structure. See
+ ## included LICENSE file for license information.
+
+-AM_CPPFLAGS += -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include $(USB_CFLAGS) -DLIBDIR="\"$(libdir)/sane\""
++AM_CPPFLAGS += -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include $(USB_CFLAGS) -DLIBDIR="\"$(libdir)/sane\"" -DDEB_DLL_LIBDIR="\"$(libdir)/sane:$(prefix)/lib/sane\:$(prefix)/lib64/sane\""
+
+ AM_LDFLAGS += $(STRICT_LDFLAGS)
+ # The -rpath option is added because we are creating _LTLIBRARIES based
diff --git a/debian/patches/0140-avahi.patch b/debian/patches/0140-avahi.patch
new file mode 100644
index 0000000..b666bff
--- /dev/null
+++ b/debian/patches/0140-avahi.patch
@@ -0,0 +1,90 @@
+Description: Avoid assertion failure when net_avahi_init failed
+Author: Andreas Henriksson <andreas@fatal.se>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=861112
+Forwarded: not-needed
+Last-Update: 2017-06-20
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/net.c
+===================================================================
+--- trunk.orig/backend/net.c
++++ trunk/backend/net.c
+@@ -769,7 +769,7 @@ net_avahi_browse_callback (AvahiServiceB
+ {
+ case AVAHI_BROWSER_FAILURE:
+ DBG (1, "net_avahi_browse_callback: %s\n", avahi_strerror (avahi_client_errno (avahi_service_browser_get_client (b))));
+- avahi_threaded_poll_quit (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_quit (avahi_thread);
+ return;
+
+ case AVAHI_BROWSER_NEW:
+@@ -834,7 +834,7 @@ net_avahi_callback (AvahiClient *c, Avah
+ if (avahi_browser == NULL)
+ {
+ DBG (1, "net_avahi_callback: could not create service browser: %s\n", avahi_strerror (avahi_client_errno (c)));
+- avahi_threaded_poll_quit (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_quit (avahi_thread);
+ }
+ break;
+
+@@ -857,14 +857,14 @@ net_avahi_callback (AvahiClient *c, Avah
+ if (avahi_client == NULL)
+ {
+ DBG (1, "net_avahi_init: could not create Avahi client: %s\n", avahi_strerror (error));
+- avahi_threaded_poll_quit (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_quit (avahi_thread);
+ }
+ }
+ else
+ {
+ /* Another error happened - game over */
+ DBG (1, "net_avahi_callback: server connection failure: %s\n", avahi_strerror (error));
+- avahi_threaded_poll_quit (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_quit (avahi_thread);
+ }
+ break;
+ }
+@@ -1043,12 +1043,12 @@ sane_init (SANE_Int * version_code, SANE
+ continue;
+ }
+ #if WITH_AVAHI
+- avahi_threaded_poll_lock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_lock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ DBG (2, "sane_init: trying to add %s\n", device_name);
+ add_device (device_name, 0);
+ #if WITH_AVAHI
+- avahi_threaded_poll_unlock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_unlock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ }
+
+@@ -1094,12 +1094,12 @@ sane_init (SANE_Int * version_code, SANE
+ continue;
+ #endif /* ENABLE_IPV6 */
+ #if WITH_AVAHI
+- avahi_threaded_poll_lock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_lock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ DBG (2, "sane_init: trying to add %s\n", host);
+ add_device (host, 0);
+ #if WITH_AVAHI
+- avahi_threaded_poll_unlock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_unlock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ }
+ free (copy);
+@@ -1517,11 +1517,11 @@ sane_open (SANE_String_Const full_name,
+ "sane_open: device %s not found, trying to register it anyway\n",
+ nd_name);
+ #if WITH_AVAHI
+- avahi_threaded_poll_lock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_lock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ status = add_device (nd_name, &dev);
+ #if WITH_AVAHI
+- avahi_threaded_poll_unlock (avahi_thread);
++ if (avahi_thread) avahi_threaded_poll_unlock (avahi_thread);
+ #endif /* WITH_AVAHI */
+ if (status != SANE_STATUS_GOOD)
+ {
diff --git a/debian/patches/0145-avahi.patch b/debian/patches/0145-avahi.patch
new file mode 100644
index 0000000..a5d98ef
--- /dev/null
+++ b/debian/patches/0145-avahi.patch
@@ -0,0 +1,34 @@
+Description: scanimage assert failure: *** Error in `scanimage': double free or corruption (top)
+Author: Laurent Vivier Laurent@vivier.eu
+Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/sane-backends/+bug/1208091
+Forwarded: not-needed
+Last-Update: 2017-06-20
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/net.c
+===================================================================
+--- trunk.orig/backend/net.c
++++ trunk/backend/net.c
+@@ -962,10 +962,6 @@ sane_init (SANE_Int * version_code, SANE
+ first_device = NULL;
+ first_handle = NULL;
+
+-#if WITH_AVAHI
+- net_avahi_init ();
+-#endif /* WITH_AVAHI */
+-
+ auth_callback = authorize;
+
+ /* Return the version number of the sane-backends package to allow
+@@ -1117,6 +1113,11 @@ sane_init (SANE_Int * version_code, SANE
+ DBG (2, "sane_init: connect timeout set to %d seconds from env\n", connect_timeout);
+ }
+
++#if WITH_AVAHI
++ net_avahi_init ();
++#endif /* WITH_AVAHI */
++
++
+ DBG (2, "sane_init: done\n");
+ return SANE_STATUS_GOOD;
+ }
diff --git a/debian/patches/0150-i386-test.patch b/debian/patches/0150-i386-test.patch
new file mode 100644
index 0000000..70681dd
--- /dev/null
+++ b/debian/patches/0150-i386-test.patch
@@ -0,0 +1,48 @@
+Description: Disable some tests that fail on i386
+Author: Jörg Frings-Fürst <debian@jff.email>
+Forwarded: not-needed
+Last-Update: 2020-04-01
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/testsuite/backend/genesys/tests_image.cpp
+===================================================================
+--- trunk.orig/testsuite/backend/genesys/tests_image.cpp
++++ trunk/testsuite/backend/genesys/tests_image.cpp
+@@ -122,14 +122,14 @@ void test_set_pixel_to_row()
+
+ pixel = Pixel(0x1200, 0x1200, 0x1200);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I8);
+- ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
+- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
++// ASSERT_EQ(data, Data({0x12, 0x00, 0x00, 0x00, 0x00, 0x00,
++// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x1200, 0x1200);
+ set_pixel_to_row(data.data(), 2, pixel, PixelFormat::I8);
+- ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
++// ASSERT_EQ(data, Data({0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
++// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1200, 0x3400, 0x5600);
+@@ -158,14 +158,14 @@ void test_set_pixel_to_row()
+
+ pixel = Pixel(0x1234, 0x1234, 0x1234);
+ set_pixel_to_row(data.data(), 0, pixel, PixelFormat::I16);
+- ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
+- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
++// ASSERT_EQ(data, Data({0x34, 0x12, 0x00, 0x00, 0x00, 0x00,
++// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x1234, 0x1234);
+ set_pixel_to_row(data.data(), 1, pixel, PixelFormat::I16);
+- ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
+- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
++// ASSERT_EQ(data, Data({0x00, 0x00, 0x34, 0x12, 0x00, 0x00,
++// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}));
+ reset();
+
+ pixel = Pixel(0x1234, 0x5678, 0x9abc);
diff --git a/debian/patches/0155-hurd_PATH_MAX.patch b/debian/patches/0155-hurd_PATH_MAX.patch
new file mode 100644
index 0000000..71d4c68
--- /dev/null
+++ b/debian/patches/0155-hurd_PATH_MAX.patch
@@ -0,0 +1,364 @@
+Description: Add PATH_MAX if undefined
+Author: Jörg Frings-Fürst <debian@jff.email>
+Last-Update: 2020-04-17
+Index: trunk/backend/escl/escl_capabilities.c
+===================================================================
+--- trunk.orig/backend/escl/escl_capabilities.c
++++ trunk/backend/escl/escl_capabilities.c
+@@ -34,6 +34,10 @@
+
+ #include "../include/sane/saneopts.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 4096
++#endif
++
+ struct cap
+ {
+ char *memory;
+Index: trunk/backend/escl/escl.h
+===================================================================
+--- trunk.orig/backend/escl/escl.h
++++ trunk/backend/escl/escl.h
+@@ -67,6 +67,10 @@
+ # define DBGDUMP(level, buf, size)
+ #endif
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ #define ESCL_CONFIG_FILE "escl.conf"
+
+
+Index: trunk/backend/canon630u.c
+===================================================================
+--- trunk.orig/backend/canon630u.c
++++ trunk/backend/canon630u.c
+@@ -65,6 +65,10 @@
+
+ #include "canon630u-common.c"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ typedef struct Canon_Device
+ {
+ struct Canon_Device *next;
+Index: trunk/backend/canon_pp.c
+===================================================================
+--- trunk.orig/backend/canon_pp.c
++++ trunk/backend/canon_pp.c
+@@ -77,6 +77,11 @@
+ #include "../include/sane/sanei_backend.h"
+ /* #include "../include/sane/sanei_debug.h" */
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
++
+
+ /* Prototypes */
+ static SANE_Status init_device(struct parport *pp);
+Index: trunk/backend/gt68xx.h
+===================================================================
+--- trunk.orig/backend/gt68xx.h
++++ trunk/backend/gt68xx.h
+@@ -51,4 +51,8 @@
+
+ #define GT68XX_CONFIG_FILE "gt68xx.conf"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ #endif /* not GT68XX_H */
+Index: trunk/backend/hp3900_sane.c
+===================================================================
+--- trunk.orig/backend/hp3900_sane.c
++++ trunk/backend/hp3900_sane.c
+@@ -53,6 +53,11 @@
+
+ #include "hp3900_rts8822.c"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
++
+ struct st_convert
+ {
+ SANE_Int colormode;
+Index: trunk/backend/hp4200.h
+===================================================================
+--- trunk.orig/backend/hp4200.h
++++ trunk/backend/hp4200.h
+@@ -26,6 +26,10 @@
+ #define min(a, b) (((a) < (b)) ? (a) : (b))
+ #define max(a, b) (((a) > (b)) ? (a) : (b))
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+
+ /*--------------------------------------------------------------------------*/
+
+Index: trunk/backend/hp5400_sane.c
+===================================================================
+--- trunk.orig/backend/hp5400_sane.c
++++ trunk/backend/hp5400_sane.c
+@@ -87,6 +87,9 @@
+
+ #define NUM_GAMMA_ENTRIES 65536
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
+
+ /* options enumerator */
+ typedef enum
+Index: trunk/backend/hpsj5s.c
+===================================================================
+--- trunk.orig/backend/hpsj5s.c
++++ trunk/backend/hpsj5s.c
+@@ -56,6 +56,9 @@
+ #include <stdio.h>
+ #include <unistd.h>
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
+
+ #define LINES_TO_FEED 480 /*Default feed length */
+
+Index: trunk/backend/leo.c
+===================================================================
+--- trunk.orig/backend/leo.c
++++ trunk/backend/leo.c
+@@ -75,6 +75,10 @@
+
+ #include "leo.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+
+ /* Lists of possible scan modes. */
+Index: trunk/backend/lexmark.c
+===================================================================
+--- trunk.orig/backend/lexmark.c
++++ trunk/backend/lexmark.c
+@@ -45,6 +45,10 @@
+
+ #include "lexmark.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ #define LEXMARK_CONFIG_FILE "lexmark.conf"
+ #define BUILD 32
+ #define MAX_OPTION_STRING_SIZE 255
+Index: trunk/backend/matsushita.c
+===================================================================
+--- trunk.orig/backend/matsushita.c
++++ trunk/backend/matsushita.c
+@@ -79,6 +79,10 @@
+
+ #include "matsushita.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+
+ /* Lists of possible scan modes. */
+Index: trunk/backend/p5_device.c
+===================================================================
+--- trunk.orig/backend/p5_device.c
++++ trunk/backend/p5_device.c
+@@ -1,3 +1,8 @@
++
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /**
+ * Description of the Primax PagePartner model
+ */
+Index: trunk/backend/pie.c
+===================================================================
+--- trunk.orig/backend/pie.c
++++ trunk/backend/pie.c
+@@ -132,8 +132,11 @@
+
+ #define min(a,b) (((a)<(b))?(a):(b))
+ #define max(a,b) (((a)>(b))?(a):(b))
+-
+-
++
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /* names of scanners that are supported because */
+ /* the inquiry_return_block is ok and driver is tested */
+
+Index: trunk/backend/pieusb.c
+===================================================================
+--- trunk.orig/backend/pieusb.c
++++ trunk/backend/pieusb.c
+@@ -107,6 +107,10 @@ extern void write_tiff_rgbi_header (FILE
+ #define DBG_info_scan 11 /* information scanner commands */
+ #define DBG_info_usb 13 /* information usb level functions */
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /* device flags */
+
+ #define FLAG_SLIDE_TRANSPORT 0x01
+Index: trunk/backend/plustek-usb.c
+===================================================================
+--- trunk.orig/backend/plustek-usb.c
++++ trunk/backend/plustek-usb.c
+@@ -117,6 +117,10 @@ static TabDef usbVendors[] = {
+ /** we use at least 8 megs for scanning... */
+ #define _SCANBUF_SIZE (8 * 1024 * 1024)
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /********************** the USB scanner interface ****************************/
+
+ /** remove the slash out of the model-name to obtain a valid filename
+Index: trunk/backend/sceptre.c
+===================================================================
+--- trunk.orig/backend/sceptre.c
++++ trunk/backend/sceptre.c
+@@ -77,6 +77,10 @@
+
+ #include "sceptre.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+
+ static const SANE_String scan_mode_list[] = { LINEART_STR, HALFTONE_STR,
+Index: trunk/backend/sp15c.c
+===================================================================
+--- trunk.orig/backend/sp15c.c
++++ trunk/backend/sp15c.c
+@@ -225,6 +225,10 @@
+ #include "sp15c-scsi.h"
+ #include "sp15c.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /* ------------------------------------------------------------------------- */
+
+ static const char negativeStr[] = "Negative";
+Index: trunk/backend/stv680.c
+===================================================================
+--- trunk.orig/backend/stv680.c
++++ trunk/backend/stv680.c
+@@ -98,6 +98,10 @@
+
+ #define TIMEOUT 1000
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+ /* Lists of possible scan modes. */
+ static SANE_String_Const scan_mode_list[] = {
+Index: trunk/backend/teco1.c
+===================================================================
+--- trunk.orig/backend/teco1.c
++++ trunk/backend/teco1.c
+@@ -83,6 +83,10 @@
+ #define sanei_scsi_close(a) SANE_STATUS_GOOD
+ #endif
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+
+ /* Lists of possible scan modes. */
+Index: trunk/backend/teco2.c
+===================================================================
+--- trunk.orig/backend/teco2.c
++++ trunk/backend/teco2.c
+@@ -103,6 +103,10 @@
+ #define sanei_scsi_close(a) SANE_STATUS_GOOD
+ #endif
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /* For debugging purposes: output a stream straight out from the
+ * scanner without reordering the colors, 0=normal, 1 = raw. */
+ static int raw_output = 0;
+Index: trunk/backend/teco3.c
+===================================================================
+--- trunk.orig/backend/teco3.c
++++ trunk/backend/teco3.c
+@@ -75,6 +75,10 @@
+
+ #include "teco3.h"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ /*--------------------------------------------------------------------------*/
+
+ /* Lists of possible scan modes. */
+Index: trunk/backend/test.c
+===================================================================
+--- trunk.orig/backend/test.c
++++ trunk/backend/test.c
+@@ -74,6 +74,10 @@
+
+ #define TEST_CONFIG_FILE "test.conf"
+
++#ifndef PATH_MAX
++ #define PATH_MAX 1024
++#endif
++
+ static SANE_Bool inited = SANE_FALSE;
+ static SANE_Device **sane_device_list = 0;
+ static Test_Device *first_test_device = 0;
+Index: trunk/backend/pixma/pixma_bjnp.c
+===================================================================
+--- trunk.orig/backend/pixma/pixma_bjnp.c
++++ trunk/backend/pixma/pixma_bjnp.c
+@@ -117,6 +117,12 @@
+ # endif
+ #endif
+
++#ifndef HOST_NAME_MAX
++ #define HOST_NAME_MAX 64
++#endif
++
++
++
+ /* static data */
+ static bjnp_device_t device[BJNP_NO_DEVICES];
+ static int bjnp_no_devices = 0;
diff --git a/debian/patches/0165-respect_local_only_parameter.patch b/debian/patches/0165-respect_local_only_parameter.patch
new file mode 100644
index 0000000..f73a731
--- /dev/null
+++ b/debian/patches/0165-respect_local_only_parameter.patch
@@ -0,0 +1,768 @@
+Description: respect 'local_only' parameter of sane_get_devices()
+Author: Barnabás Pőcze <pobrn@protonmail.com>
+Origin: backport, https://gitlab.com/sane-project/backends/-/commit/245564dffe96ddf0fd1c703c48973cd35fddd268
+Bug: https://gitlab.com/sane-project/backends/-/merge_requests/502/
+Forwarded: no-needed
+Last-Update: 2020-09-05
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/dell1600n_net.c
+===================================================================
+--- trunk.orig/backend/dell1600n_net.c
++++ trunk/backend/dell1600n_net.c
+@@ -288,8 +288,7 @@ sane_exit (void)
+ /***********************************************************/
+
+ SANE_Status
+-sane_get_devices (const SANE_Device *** device_list,
+- SANE_Bool __sane_unused__ local_only)
++sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
+ {
+
+ int ret;
+@@ -312,6 +311,10 @@ sane_get_devices (const SANE_Device ***
+ sock = 0;
+ pDevice = NULL;
+ optYes = 1;
++
++ if (local_only)
++ return ret;
++
+ InitComBuf (&queryPacket);
+
+ /* clear previous results */
+Index: trunk/backend/epson2.c
+===================================================================
+--- trunk.orig/backend/epson2.c
++++ trunk/backend/epson2.c
+@@ -813,10 +813,11 @@ attach_one_pio(const char *dev)
+ }
+
+ static SANE_Status
+-attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
++attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
++ void *data)
+ {
+ int vendor, product;
+-
++ SANE_Bool local_only = *(SANE_Bool*) data;
+ int len = strlen(line);
+
+ DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
+@@ -847,13 +848,16 @@ attach_one_config(SANEI_Config __sane_un
+
+ } else if (strncmp(line, "net", 3) == 0) {
+
+- /* remove the "net" sub string */
+- const char *name = sanei_config_skip_whitespace(line + 3);
+-
+- if (strncmp(name, "autodiscovery", 13) == 0)
+- e2_network_discovery();
+- else
+- attach_one_net(name);
++ if (!local_only) {
++ /* remove the "net" sub string */
++ const char *name =
++ sanei_config_skip_whitespace(line + 3);
++
++ if (strncmp(name, "autodiscovery", 13) == 0)
++ e2_network_discovery();
++ else
++ attach_one_net(name);
++ }
+
+ } else if (strncmp(line, "pio", 3) == 0) {
+
+@@ -889,14 +893,14 @@ free_devices(void)
+ }
+
+ static void
+-probe_devices(void)
++probe_devices(SANE_Bool local_only)
+ {
+ DBG(5, "%s\n", __func__);
+
+ free_devices();
+
+ sanei_configure_attach(EPSON2_CONFIG_FILE, NULL,
+- attach_one_config);
++ attach_one_config, &local_only);
+ }
+
+ SANE_Status
+@@ -926,14 +930,14 @@ sane_exit(void)
+ }
+
+ SANE_Status
+-sane_get_devices(const SANE_Device ***device_list, SANE_Bool __sane_unused__ local_only)
++sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only)
+ {
+ Epson_Device *dev;
+ int i;
+
+ DBG(5, "%s\n", __func__);
+
+- probe_devices();
++ probe_devices(local_only);
+
+ devlist = malloc((num_devices + 1) * sizeof(devlist[0]));
+ if (!devlist) {
+@@ -1470,7 +1474,7 @@ sane_open(SANE_String_Const name, SANE_H
+ /* probe if empty device name provided */
+ if (l == 0) {
+
+- probe_devices();
++ probe_devices(SANE_FALSE);
+
+ if (first_dev == NULL) {
+ DBG(1, "no device detected\n");
+@@ -1507,7 +1511,7 @@ sane_open(SANE_String_Const name, SANE_H
+ */
+
+ if (first_dev == NULL)
+- probe_devices();
++ probe_devices(SANE_FALSE);
+
+ s = device_detect(name, SANE_EPSON_NODEV, 0, &status);
+ if (s == NULL) {
+Index: trunk/backend/epsonds.c
+===================================================================
+--- trunk.orig/backend/epsonds.c
++++ trunk/backend/epsonds.c
+@@ -481,10 +481,11 @@ attach_one_net(const char *dev)
+
+
+ static SANE_Status
+-attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
++attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
++ void *data)
+ {
+ int vendor, product;
+-
++ SANE_Bool local_only = *(SANE_Bool*) data;
+ int len = strlen(line);
+
+ DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
+@@ -513,13 +514,16 @@ attach_one_config(SANEI_Config __sane_un
+
+ } else if (strncmp(line, "net", 3) == 0) {
+
+- /* remove the "net" sub string */
+- const char *name = sanei_config_skip_whitespace(line + 3);
+-
+- if (strncmp(name, "autodiscovery", 13) == 0)
+- e2_network_discovery();
+- else
+- attach_one_net(name);
++ if (!local_only) {
++ /* remove the "net" sub string */
++ const char *name =
++ sanei_config_skip_whitespace(line + 3);
++
++ if (strncmp(name, "autodiscovery", 13) == 0)
++ e2_network_discovery();
++ else
++ attach_one_net(name);
++ }
+
+ } else {
+ DBG(0, "unable to parse config line: %s\n", line);
+@@ -545,12 +549,13 @@ free_devices(void)
+ }
+
+ static void
+-probe_devices(void)
++probe_devices(SANE_Bool local_only)
+ {
+ DBG(5, "%s\n", __func__);
+
+ free_devices();
+- sanei_configure_attach(EPSONDS_CONFIG_FILE, NULL, attach_one_config);
++ sanei_configure_attach(EPSONDS_CONFIG_FILE, NULL,
++ attach_one_config, &local_only);
+ }
+
+ /**** SANE API ****/
+@@ -581,14 +586,14 @@ sane_exit(void)
+ }
+
+ SANE_Status
+-sane_get_devices(const SANE_Device ***device_list, SANE_Bool __sane_unused__ local_only)
++sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only)
+ {
+ int i;
+ epsonds_device *dev;
+
+ DBG(5, "** %s\n", __func__);
+
+- probe_devices();
++ probe_devices(local_only);
+
+ devlist = malloc((num_devices + 1) * sizeof(devlist[0]));
+ if (!devlist) {
+@@ -793,7 +798,7 @@ sane_open(SANE_String_Const name, SANE_H
+ /* probe if empty device name provided */
+ if (name[0] == '\0') {
+
+- probe_devices();
++ probe_devices(SANE_FALSE);
+
+ if (first_dev == NULL) {
+ DBG(1, "no devices detected\n");
+Index: trunk/backend/escl/escl.c
+===================================================================
+--- trunk.orig/backend/escl/escl.c
++++ trunk/backend/escl/escl.c
+@@ -383,7 +383,8 @@ sane_exit(void)
+ * \return escl_add_in_list(escl_device) if the parsing worked, SANE_STATUS_GOOD otherwise.
+ */
+ static SANE_Status
+-attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
++attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
++ void __sane_unused__ *data)
+ {
+ int port = 0;
+ SANE_Status status;
+@@ -487,7 +488,8 @@ sane_get_devices(const SANE_Device ***de
+
+ if (device_list == NULL)
+ return (SANE_STATUS_INVAL);
+- status = sanei_configure_attach(ESCL_CONFIG_FILE, NULL, attach_one_config);
++ status = sanei_configure_attach(ESCL_CONFIG_FILE, NULL,
++ attach_one_config, NULL);
+ if (status != SANE_STATUS_GOOD)
+ return (status);
+ escl_devices(&status);
+Index: trunk/backend/genesys/genesys.cpp
+===================================================================
+--- trunk.orig/backend/genesys/genesys.cpp
++++ trunk/backend/genesys/genesys.cpp
+@@ -5186,7 +5186,8 @@ static SANE_Status attach_one_device(SAN
+
+ // this function is passed to C API, it must not throw
+ static SANE_Status
+-config_attach_genesys(SANEI_Config __sane_unused__ *config, const char *devname) noexcept
++config_attach_genesys(SANEI_Config __sane_unused__ *config, const char *devname,
++ void __sane_unused__ *data) noexcept
+ {
+ /* the devname has been processed and is ready to be used
+ * directly. Since the backend is an USB only one, we can
+@@ -5214,7 +5215,8 @@ static void probe_genesys_devices()
+ config.values = nullptr;
+ config.count = 0;
+
+- auto status = sanei_configure_attach(GENESYS_CONFIG_FILE, &config, config_attach_genesys);
++ auto status = sanei_configure_attach(GENESYS_CONFIG_FILE, &config,
++ config_attach_genesys, NULL);
+ if (status == SANE_STATUS_ACCESS_DENIED) {
+ dbg.vlog(DBG_error0, "Critical error: Couldn't access configuration file '%s'",
+ GENESYS_CONFIG_FILE);
+Index: trunk/backend/kodakaio.c
+===================================================================
+--- trunk.orig/backend/kodakaio.c
++++ trunk/backend/kodakaio.c
+@@ -2513,10 +2513,11 @@ attach_one_net(const char *dev, unsigned
+ }
+
+ static SANE_Status
+-attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
++attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
++ void *data)
+ {
+ int vendor, product, timeout;
+-
++ SANE_Bool local_only = *(SANE_Bool*) data;
+ int len = strlen(line);
+
+ DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
+@@ -2550,27 +2551,30 @@ attach_one_config(SANEI_Config __sane_un
+
+ } else if (strncmp(line, "net", 3) == 0) {
+
+- /* remove the "net" sub string */
+- const char *name = sanei_config_skip_whitespace(line + 3);
+- char IP[1024];
+- unsigned int model = 0;
+-
+- if (strncmp(name, "autodiscovery", 13) == 0) {
+-
+-#if WITH_AVAHI
+- DBG (30, "%s: Initiating network autodiscovery via avahi\n", __func__);
+- kodak_network_discovery(NULL);
+-#else
+- DBG (20, "%s: Network autodiscovery not done because not configured with avahi.\n", __func__);
+-#endif
+-
+- } else if (sscanf(name, "%s %x", IP, &model) == 2) {
+- DBG(30, "%s: Using network device on IP %s, forcing model 0x%x\n", __func__, IP, model);
+- attach_one_net(IP, model);
+- } else {
++ if (!local_only) {
++ /* remove the "net" sub string */
++ const char *name =
++ sanei_config_skip_whitespace(line + 3);
++ char IP[1024];
++ unsigned int model = 0;
++
++ if (strncmp(name, "autodiscovery", 13) == 0) {
++
++ #if WITH_AVAHI
++ DBG (30, "%s: Initiating network autodiscovery via avahi\n", __func__);
++ kodak_network_discovery(NULL);
++ #else
++ DBG (20, "%s: Network autodiscovery not done because not configured with avahi.\n", __func__);
++ #endif
++
++ } else if (sscanf(name, "%s %x", IP, &model) == 2) {
++ DBG(30, "%s: Using network device on IP %s, forcing model 0x%x\n", __func__, IP, model);
++ attach_one_net(IP, model);
++ } else {
+ DBG(1, "%s: net entry %s may be a host name?\n", __func__, name);
+ attach_one_net(name, 0);
+ }
++ }
+
+ } else if (sscanf(line, "snmp-timeout %i\n", &timeout)) {
+ /* Timeout for auto network discovery */
+@@ -2646,7 +2650,7 @@ sane_exit(void)
+ }
+
+ SANE_Status
+-sane_get_devices(const SANE_Device ***device_list, SANE_Bool __sane_unused__ local_only)
++sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only)
+ {
+ Kodak_Device *dev, *s, *prev=0;
+ int i;
+@@ -2662,7 +2666,7 @@ sane_get_devices(const SANE_Device ***de
+
+ /* Read the config, mark each device as found, possibly add new devs */
+ sanei_configure_attach(KODAKAIO_CONFIG_FILE, NULL,
+- attach_one_config);
++ attach_one_config, &local_only);
+
+ /*delete missing scanners from list*/
+ for (s = first_dev; s;) {
+Index: trunk/backend/magicolor.c
+===================================================================
+--- trunk.orig/backend/magicolor.c
++++ trunk/backend/magicolor.c
+@@ -2157,10 +2157,11 @@ attach_one_net(const char *dev, unsigned
+ }
+
+ static SANE_Status
+-attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
++attach_one_config(SANEI_Config __sane_unused__ *config, const char *line,
++ void *data)
+ {
+ int vendor, product, timeout;
+-
++ SANE_Bool local_only = *(SANE_Bool*) data;
+ int len = strlen(line);
+
+ DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
+@@ -2189,24 +2190,27 @@ attach_one_config(SANEI_Config __sane_un
+
+ } else if (strncmp(line, "net", 3) == 0) {
+
+- /* remove the "net" sub string */
+- const char *name = sanei_config_skip_whitespace(line + 3);
+- char IP[1024];
+- unsigned int model = 0;
+-
+- if (strncmp(name, "autodiscovery", 13) == 0) {
+- DBG (50, "%s: Initiating network autodiscovervy via SNMP\n", __func__);
+- mc_network_discovery(NULL);
+- } else if (sscanf(name, "%s %x", IP, &model) == 2) {
+- DBG(50, "%s: Using network device on IP %s, forcing model 0x%x\n", __func__, IP, model);
+- attach_one_net(IP, model);
+- } else {
+- /* use SNMP to detect the type. If not successful,
+- * add the host with model type 0 */
+- DBG(50, "%s: Using network device on IP %s, trying to autodetect model\n", __func__, IP);
+- if (mc_network_discovery(name)==0) {
+- DBG(1, "%s: Autodetecting device model failed, using default model\n", __func__);
+- attach_one_net(name, 0);
++ if (!local_only) {
++ /* remove the "net" sub string */
++ const char *name =
++ sanei_config_skip_whitespace(line + 3);
++ char IP[1024];
++ unsigned int model = 0;
++
++ if (strncmp(name, "autodiscovery", 13) == 0) {
++ DBG (50, "%s: Initiating network autodiscovervy via SNMP\n", __func__);
++ mc_network_discovery(NULL);
++ } else if (sscanf(name, "%s %x", IP, &model) == 2) {
++ DBG(50, "%s: Using network device on IP %s, forcing model 0x%x\n", __func__, IP, model);
++ attach_one_net(IP, model);
++ } else {
++ /* use SNMP to detect the type. If not successful,
++ * add the host with model type 0 */
++ DBG(50, "%s: Using network device on IP %s, trying to autodetect model\n", __func__, IP);
++ if (mc_network_discovery(name)==0) {
++ DBG(1, "%s: Autodetecting device model failed, using default model\n", __func__);
++ attach_one_net(name, 0);
++ }
+ }
+ }
+
+@@ -2279,7 +2283,7 @@ sane_exit(void)
+ }
+
+ SANE_Status
+-sane_get_devices(const SANE_Device ***device_list, SANE_Bool __sane_unused__ local_only)
++sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only)
+ {
+ Magicolor_Device *dev, *s, *prev=0;
+ int i;
+@@ -2295,7 +2299,7 @@ sane_get_devices(const SANE_Device ***de
+
+ /* Read the config, mark each device as found, possibly add new devs */
+ sanei_configure_attach(MAGICOLOR_CONFIG_FILE, NULL,
+- attach_one_config);
++ attach_one_config, &local_only);
+
+ /*delete missing scanners from list*/
+ for (s = first_dev; s;) {
+Index: trunk/backend/p5.c
+===================================================================
+--- trunk.orig/backend/p5.c
++++ trunk/backend/p5.c
+@@ -1566,7 +1566,8 @@ probe_p5_devices (void)
+ config.count = NUM_CFG_OPTIONS;
+
+ /* generic configure and attach function */
+- status = sanei_configure_attach (P5_CONFIG_FILE, &config, config_attach);
++ status = sanei_configure_attach (P5_CONFIG_FILE, &config,
++ config_attach, NULL);
+ /* free allocated options */
+ for (i = 0; i < NUM_CFG_OPTIONS; i++)
+ {
+@@ -1590,7 +1591,8 @@ probe_p5_devices (void)
+ * SANE_STATUS_INVAL in case of error
+ */
+ static SANE_Status
+-config_attach (SANEI_Config * config, const char *devname)
++config_attach (SANEI_Config __sane_unused__ * config, const char *devname,
++ void __sane_unused__ *data)
+ {
+ /* currently, the config is a global variable so config is useless here */
+ /* the correct thing would be to have a generic sanei_attach_matching_devices
+Index: trunk/backend/p5.h
+===================================================================
+--- trunk.orig/backend/p5.h
++++ trunk/backend/p5.h
+@@ -195,7 +195,8 @@ typedef struct P5_Session
+
+ static SANE_Status probe_p5_devices (void);
+ static P5_Model *probe (const char *devicename);
+-static SANE_Status config_attach (SANEI_Config * config, const char *devname);
++static SANE_Status config_attach (SANEI_Config * config, const char *devname,
++ void *data);
+ static SANE_Status attach_p5 (const char *name, SANEI_Config * config);
+ static SANE_Status init_options (struct P5_Session *session);
+ static SANE_Status compute_parameters (struct P5_Session *session);
+Index: trunk/backend/pixma/pixma.c
+===================================================================
+--- trunk.orig/backend/pixma/pixma.c
++++ trunk/backend/pixma/pixma.c
+@@ -159,10 +159,11 @@ static void mark_all_button_options_cach
+ ss -> button_option_is_cached[i] = 1;
+ }
+
+-static SANE_Status config_attach_pixma(SANEI_Config * config, const char *devname)
++static SANE_Status config_attach_pixma(SANEI_Config __sane_unused__ * config,
++ const char *devname,
++ void __sane_unused__ *data)
+ {
+ int i;
+- UNUSED(config);
+ for (i=0; i < (MAX_CONF_DEVICES -1); i++)
+ {
+ if(conf_devices[i] == NULL)
+@@ -1656,8 +1657,8 @@ sane_init (SANE_Int * version_code, SANE
+ config.descriptors = NULL;
+ config.values = NULL;
+
+- if (sanei_configure_attach(PIXMA_CONFIG_FILE, &config, config_attach_pixma) !=
+- SANE_STATUS_GOOD)
++ if (sanei_configure_attach(PIXMA_CONFIG_FILE, &config,
++ config_attach_pixma, NULL) != SANE_STATUS_GOOD)
+ PDBG(pixma_dbg(2, "Could not read pixma configuration file: %s\n",
+ PIXMA_CONFIG_FILE));
+
+Index: trunk/backend/rts8891.c
+===================================================================
+--- trunk.orig/backend/rts8891.c
++++ trunk/backend/rts8891.c
+@@ -217,7 +217,7 @@ static Rts8891_Config rtscfg;
+ /* ------------------------------------------------------------------------- */
+ static SANE_Status probe_rts8891_devices (void);
+ static SANE_Status config_attach_rts8891 (SANEI_Config * config,
+- const char *devname);
++ const char *devname, void *data);
+ static SANE_Status attach_rts8891 (const char *name);
+ static SANE_Status set_lamp_brightness (struct Rts8891_Device *dev,
+ int level);
+@@ -2374,7 +2374,7 @@ probe_rts8891_devices (void)
+
+ /* generic configure and attach function */
+ status = sanei_configure_attach (RTS8891_CONFIG_FILE, &config,
+- config_attach_rts8891);
++ config_attach_rts8891, NULL);
+ /* free allocated options */
+ for (i = 0; i < NUM_CFG_OPTIONS; i++)
+ {
+@@ -2398,7 +2398,8 @@ probe_rts8891_devices (void)
+ * SANE_STATUS_INVAL in case of error
+ */
+ static SANE_Status
+-config_attach_rts8891 (SANEI_Config * config, const char *devname)
++config_attach_rts8891 (SANEI_Config * config, const char *devname,
++ void __sane_unused__ *data)
+ {
+ /* currently, the config is a global variable so config is useless here */
+ /* the correct thing would be to have a generic sanei_attach_matching_devices
+Index: trunk/backend/umax_pp.c
+===================================================================
+--- trunk.orig/backend/umax_pp.c
++++ trunk/backend/umax_pp.c
+@@ -419,7 +419,8 @@ umax_pp_auto_attach (SANEI_Config * conf
+ * device name to use for attach try.
+ */
+ static SANE_Status
+-umax_pp_configure_attach (SANEI_Config * config, const char *devname)
++umax_pp_configure_attach (SANEI_Config * config, const char *devname,
++ void __sane_unused__ *data)
+ {
+ const char *lp;
+ SANE_Char *token;
+@@ -961,7 +962,7 @@ sane_init (SANE_Int * version_code, SANE
+
+ /* generic configure and attach function */
+ status = sanei_configure_attach (UMAX_PP_CONFIG_FILE, &config,
+- umax_pp_configure_attach);
++ umax_pp_configure_attach, NULL);
+
+ /* free option descriptors */
+ for (i = 0; i < NUM_CFG_OPTIONS; i++)
+Index: trunk/backend/xerox_mfp.c
+===================================================================
+--- trunk.orig/backend/xerox_mfp.c
++++ trunk/backend/xerox_mfp.c
+@@ -1028,7 +1028,8 @@ list_one_device(SANE_String_Const devnam
+
+ /* SANE API ignores return code of this callback */
+ static SANE_Status
+-list_conf_devices(UNUSED(SANEI_Config *config), const char *devname)
++list_conf_devices(SANEI_Config __sane_unused__ *config, const char *devname,
++ void __sane_unused__ *data)
+ {
+ return tr_from_devname(devname)->configure_device(devname, list_one_device);
+ }
+@@ -1080,7 +1081,7 @@ sane_get_devices(const SANE_Device *** d
+ config.count = 0;
+ config.descriptors = NULL;
+ config.values = NULL;
+- sanei_configure_attach(XEROX_CONFIG_FILE, &config, list_conf_devices);
++ sanei_configure_attach(XEROX_CONFIG_FILE, &config, list_conf_devices, NULL);
+
+ for (dev_count = 0, dev = devices_head; dev; dev = dev->next)
+ dev_count++;
+Index: trunk/include/sane/sanei_config.h
+===================================================================
+--- trunk.orig/include/sane/sanei_config.h
++++ trunk/include/sane/sanei_config.h
+@@ -166,7 +166,9 @@ typedef struct
+ extern SANE_Status sanei_configure_attach (
+ const char *config_file,
+ SANEI_Config *config,
+- SANE_Status (*config_attach)(SANEI_Config *config, const char *devname)
++ SANE_Status (*config_attach)(SANEI_Config *config, const char *devname,
++ void *data),
++ void *data
+ );
+
+ /** Return the list of config directories, extracted from the SANE_CONFIG_DIR
+Index: trunk/sanei/sanei_config.c
+===================================================================
+--- trunk.orig/sanei/sanei_config.c
++++ trunk/sanei/sanei_config.c
+@@ -239,7 +239,8 @@ sanei_config_read (char *str, int n, FIL
+ SANE_Status
+ sanei_configure_attach (const char *config_file, SANEI_Config * config,
+ SANE_Status (*attach) (SANEI_Config * config,
+- const char *devname))
++ const char *devname, void *data),
++ void *data)
+ {
+ SANE_Char line[PATH_MAX];
+ SANE_Char *token, *string;
+@@ -443,7 +444,7 @@ sanei_configure_attach (const char *conf
+ DBG (3, "sanei_configure_attach: trying to attach with '%s'\n",
+ lp2);
+ if(attach!=NULL)
+- attach (config, lp2);
++ attach (config, lp2, data);
+ }
+ }
+
+Index: trunk/testsuite/sanei/sanei_config_test.c
+===================================================================
+--- trunk.orig/testsuite/sanei/sanei_config_test.c
++++ trunk/testsuite/sanei/sanei_config_test.c
+@@ -63,7 +63,8 @@ static const SANE_String_Const string_li
+ static char *lastdevname = NULL;
+
+ static SANE_Status
+-check_config_attach (SANEI_Config * config, const char *devname)
++check_config_attach (SANEI_Config * config, const char *devname,
++ void __sane_unused__ *data)
+ {
+ /* silence compiler warning for now */
+ if (config == NULL)
+@@ -97,7 +98,8 @@ inexistent_config (void)
+ config.descriptors = NULL;
+ config.values = NULL;
+ status = sanei_configure_attach (CONFIG_PATH
+- "/data/inexistent.conf", &config, NULL);
++ "/data/inexistent.conf", &config,
++ NULL, NULL);
+
+ /* check results */
+ assert (status != SANE_STATUS_GOOD);
+@@ -114,7 +116,7 @@ null_config (void)
+
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/umax_pp.conf", NULL,
+- check_config_attach);
++ check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -130,7 +132,7 @@ null_attach (void)
+ SANE_Status status;
+
+ status = sanei_configure_attach (CONFIG_PATH
+- "/data/umax_pp.conf", NULL, NULL);
++ "/data/umax_pp.conf", NULL, NULL, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -151,7 +153,7 @@ empty_config (void)
+ config.values = NULL;
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/empty.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -206,7 +208,7 @@ string_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/string.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -250,7 +252,7 @@ int_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/int.conf", &config,
+- check_config_attach);
++ check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -293,7 +295,7 @@ wrong_range_int_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/wrong-range.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+@@ -336,7 +338,7 @@ word_array_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/word-array.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -382,7 +384,7 @@ string_list_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/string-list.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -428,7 +430,7 @@ wrong_string_list_option (void)
+ status =
+ sanei_configure_attach (CONFIG_PATH
+ "/data/wrong-string-list.conf", &config,
+- check_config_attach);
++ check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+@@ -563,7 +565,7 @@ umax_pp (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/umax_pp.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -631,7 +633,7 @@ wrong_bool_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/wrong-boolean.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+@@ -696,7 +698,7 @@ bool_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/boolean.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -767,7 +769,7 @@ fixed_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/fixed.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
+@@ -814,7 +816,7 @@ wrong_fixed_option (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/wrong-fixed.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_INVAL);
+@@ -852,7 +854,7 @@ snapscan (void)
+ /* configure and attach */
+ status =
+ sanei_configure_attach (CONFIG_PATH "/data/snapscan.conf",
+- &config, check_config_attach);
++ &config, check_config_attach, NULL);
+
+ /* check results */
+ assert (status == SANE_STATUS_GOOD);
diff --git a/debian/patches/0170-return_empty_list_when_local_devices_requested.patch b/debian/patches/0170-return_empty_list_when_local_devices_requested.patch
new file mode 100644
index 0000000..5d0ba04
--- /dev/null
+++ b/debian/patches/0170-return_empty_list_when_local_devices_requested.patch
@@ -0,0 +1,43 @@
+Description: eturn_empty_list_when_local_devices_requested
+Author: Barnabás Pőcze <pobrn@protonmail.com>
+Origin: backport, https://gitlab.com/sane-project/backends/-/commit/c946aa5a84297f33b30cddb0c89fcf375ed65d10
+Bug: https://gitlab.com/sane-project/backends/-/merge_requests/506
+Forwarded: not-needed
+Last-Update: 2020-09-19
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/dell1600n_net.c
+===================================================================
+--- trunk.orig/backend/dell1600n_net.c
++++ trunk/backend/dell1600n_net.c
+@@ -233,6 +233,9 @@ static void JpegDecompTermSource (j_deco
+ /* Results of last call to sane_get_devices */
+ static struct DeviceRecord *gKnownDevices[MAX_SCANNERS];
+
++/* Empty list for when network devices are not wanted */
++static const SANE_Device *gEmptyDeviceList[1];
++
+ /* Array of open scanner device states.
+ :NOTE: (int)SANE_Handle is an offset into this array */
+ static struct ScannerState *gOpenScanners[MAX_SCANNERS];
+@@ -306,15 +309,17 @@ sane_get_devices (const SANE_Device ***
+ const char *pVal;
+ int valLen;
+
++ if (local_only) {
++ *device_list = gEmptyDeviceList;
++ return SANE_STATUS_GOOD;
++ }
++
+ /* init variables */
+ ret = SANE_STATUS_GOOD;
+ sock = 0;
+ pDevice = NULL;
+ optYes = 1;
+
+- if (local_only)
+- return ret;
+-
+ InitComBuf (&queryPacket);
+
+ /* clear previous results */
diff --git a/debian/patches/0175-fix_tests.patch b/debian/patches/0175-fix_tests.patch
new file mode 100644
index 0000000..612d851
--- /dev/null
+++ b/debian/patches/0175-fix_tests.patch
@@ -0,0 +1,96 @@
+Description: Fix test
+Author: Jörg Frings-Fürst <debian@jff.email>
+Bug: https://gitlab.com/sane-project/backends/-/issues/443
+Last-Update: 2021-02-17
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/testsuite/tools/data/db.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/db.ref
++++ trunk/testsuite/tools/data/db.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # The entries below are used to detect a USB device when it's plugged in
+ # and then run a script to change the ownership and
+Index: trunk/testsuite/tools/data/html-backends-split.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/html-backends-split.ref
++++ trunk/testsuite/tools/data/html-backends-split.ref
+@@ -16496,6 +16496,6 @@ Grandtek Scopecam
+ >Contact</a>
+ </address>
+ <font size=-1>
+-This page was created by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++This page was created by sane-desc 3.6 from sane-backends 1.1.1-debian
+ </font>
+ </body> </html>
+Index: trunk/testsuite/tools/data/html-mfgs.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/html-mfgs.ref
++++ trunk/testsuite/tools/data/html-mfgs.ref
+@@ -23910,6 +23910,6 @@ qcam<br>(unmaintained)
+ >Contact</a>
+ </address>
+ <font size=-1>
+-This page was created by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++This page was created by sane-desc 3.6 from sane-backends 1.1.1-debian
+ </font>
+ </body> </html>
+Index: trunk/testsuite/tools/data/hwdb.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/hwdb.ref
++++ trunk/testsuite/tools/data/hwdb.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # hwdb file for supported USB devices
+ #
+Index: trunk/testsuite/tools/data/udev+acl.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/udev+acl.ref
++++ trunk/testsuite/tools/data/udev+acl.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.31-118-g5d3ce7806
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # udev rules file for supported USB and SCSI devices
+ #
+Index: trunk/testsuite/tools/data/udev+hwdb.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/udev+hwdb.ref
++++ trunk/testsuite/tools/data/udev+hwdb.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # udev rules file for supported USB and SCSI devices
+ #
+Index: trunk/testsuite/tools/data/udev.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/udev.ref
++++ trunk/testsuite/tools/data/udev.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.31-118-g5d3ce7806
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # udev rules file for supported USB and SCSI devices
+ #
+Index: trunk/testsuite/tools/data/usermap.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/usermap.ref
++++ trunk/testsuite/tools/data/usermap.ref
+@@ -1,5 +1,5 @@
+ # This file was generated from description files (*.desc)
+-# by sane-desc 3.6 from sane-backends 1.0.29-241-g1f9590ab
++# by sane-desc 3.6 from sane-backends 1.1.1-debian
+ #
+ # The entries below are used to detect a USB device and change owner
+ # and permissions on the "device node" used by libusb.
diff --git a/debian/patches/0180-gt68xx_fix_use-after-free_two_memleaks.patch b/debian/patches/0180-gt68xx_fix_use-after-free_two_memleaks.patch
new file mode 100644
index 0000000..167a9e5
--- /dev/null
+++ b/debian/patches/0180-gt68xx_fix_use-after-free_two_memleaks.patch
@@ -0,0 +1,55 @@
+Description: gt68xx: fix use-after-free and two mem leaks
+Author: <name and email of author, optional>
+Origin: https://gitlab.com/sane-project/backends/-/commit/63942f7a7473496d1160f02f5c1da3620525690d
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=980311
+Forwarded: not-needed
+Last-Update: 2021-06-24
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/gt68xx.c
+===================================================================
+--- trunk.orig/backend/gt68xx.c
++++ trunk/backend/gt68xx.c
+@@ -1174,8 +1174,11 @@ static SANE_Status probe_gt68xx_devices(
+ new_dev[i]->model->firmware_name);
+ }
+ if (i == 0)
+- DBG (5, "sane_init: firmware %s can't be loaded, set device "
+- "first\n", word);
++ {
++ DBG (5, "sane_init: firmware %s can't be loaded, set device "
++ "first\n", word);
++ free (word);
++ }
+ }
+ else
+ {
+@@ -1198,8 +1201,11 @@ static SANE_Status probe_gt68xx_devices(
+ new_dev[i]->model->name, new_dev[i]->model->vendor);
+ }
+ if (i == 0)
+- DBG (5, "sane_init: can't set vendor name %s, set device "
+- "first\n", word);
++ {
++ DBG (5, "sane_init: can't set vendor name %s, set device "
++ "first\n", word);
++ free (word);
++ }
+ }
+ else
+ {
+@@ -1221,9 +1227,11 @@ static SANE_Status probe_gt68xx_devices(
+ new_dev[i]->model->name, new_dev[i]->model->model);
+ }
+ if (i == 0)
+- DBG (5, "sane_init: can't set model name %s, set device "
+- "first\n", word);
+- free (word);
++ {
++ DBG (5, "sane_init: can't set model name %s, set device "
++ "first\n", word);
++ free (word);
++ }
+ }
+ else
+ {
diff --git a/debian/patches/0185-Change_output_from_sane-find-scanner.patch b/debian/patches/0185-Change_output_from_sane-find-scanner.patch
new file mode 100644
index 0000000..ee4bc1a
--- /dev/null
+++ b/debian/patches/0185-Change_output_from_sane-find-scanner.patch
@@ -0,0 +1,51 @@
+Description: Improve output for possible USB scanners
+Author: Ralph Little
+Origin: upstream, https://gitlab.com/sane-project/backends/-/commit/b701c499c9ce56c6bbea14b2fac2feea37f2410f
+Bug: https://gitlab.com/sane-project/backends/-/issues/575
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=983332
+Forwarded: not-needed
+Applied-Upstream: commit b701c499c9ce56c6bbea14b2fac2feea37f2410f
+Last-Update: 2022-02-21
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/tools/sane-find-scanner.c
+===================================================================
+--- trunk.orig/tools/sane-find-scanner.c
++++ trunk/tools/sane-find-scanner.c
+@@ -384,7 +384,7 @@ check_usb_file (char *file_name)
+ {
+ if (verbose > 1)
+ printf (" open ok, vendor and product ids were identified\n");
+- printf ("found USB scanner (vendor=0x%04x, "
++ printf ("found possible USB scanner (vendor=0x%04x, "
+ "product=0x%04x) at %s\n", vendor, product, file_name);
+ }
+ else
+@@ -392,7 +392,7 @@ check_usb_file (char *file_name)
+ if (verbose > 1)
+ printf (" open ok, but vendor and product could NOT be "
+ "identified\n");
+- printf ("found USB scanner (UNKNOWN vendor and product) "
++ printf ("found possible USB scanner (UNKNOWN vendor and product) "
+ "at device %s\n", file_name);
+ unknown_found = SANE_TRUE;
+ }
+@@ -676,7 +676,8 @@ check_libusb_device (struct usb_device *
+ {
+ char * chipset = check_usb_chip (dev, verbose, from_file);
+
+- printf ("found USB scanner (vendor=0x%04x", dev->descriptor.idVendor);
++ printf ("found possible USB scanner (vendor=0x%04x",
++ dev->descriptor.idVendor);
+ if (vendor)
+ printf (" [%s]", vendor);
+ printf (", product=0x%04x", dev->descriptor.idProduct);
+@@ -1066,7 +1067,7 @@ check_libusb_device (libusb_device *dev,
+ if(!from_file)
+ chipset = check_usb_chip (verbose, desc, hdl, config0);
+
+- printf ("found USB scanner (vendor=0x%04x", vid);
++ printf ("found possible USB scanner (vendor=0x%04x", vid);
+ if (vendor)
+ printf (" [%s]", vendor);
+ printf (", product=0x%04x", pid);
diff --git a/debian/patches/0190-remove-kernel-driver-for-plustek_pp.patch b/debian/patches/0190-remove-kernel-driver-for-plustek_pp.patch
new file mode 100644
index 0000000..45377dc
--- /dev/null
+++ b/debian/patches/0190-remove-kernel-driver-for-plustek_pp.patch
@@ -0,0 +1,2949 @@
+Description: Remove kernel driver for plustek_pp
+ Cherry-Picked from upstream.
+Origin: upstream
+Bug:https://gitlab.com/sane-project/backends/-/issues/578
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1008275
+Forwarded: not-needed
+Last-Update: 2022-03-26 <YYYY-MM-DD, last update of the meta-information, optional>
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/plustek-pp.h
+===================================================================
+--- trunk.orig/backend/plustek-pp.h
++++ trunk/backend/plustek-pp.h
+@@ -235,11 +235,7 @@ typedef const struct mode_param
+ #define _E_SEQUENCE (_FIRST_ERR-30) /* caller sequence does not match */
+ #define _E_NO_ASIC (_FIRST_ERR-31) /* can't detect ASIC */
+
+-#ifdef __KERNEL__
+-# define _E_FAULT (-EFAULT)
+-#else
+ # define _E_FAULT (_E_INTERNAL) /* should never happen in userspace */
+-#endif
+
+ #define _E_LAMP_NOT_IN_POS (_FIRST_ERR-40)
+ #define _E_LAMP_NOT_STABLE (_FIRST_ERR-41)
+@@ -471,10 +467,6 @@ typedef struct {
+ #define _ScanMode_AverageOut 1 /* CCD averaged 2 pixels value for output*/
+ #define _ScanMode_Mono 2 /* not color mode */
+
+-
+-#ifndef __KERNEL__
+-
+-
+ #define PLUSTEK_CONFIG_FILE "plustek_pp.conf"
+
+ #ifndef PATH_MAX
+@@ -631,7 +623,6 @@ typedef struct {
+ AdjDef adj;
+
+ } CnfDef, *pCnfDef;
+-#endif /* guard __KERNEL__ */
+
+ #endif /* guard __PLUSTEKPP_H__ */
+
+Index: trunk/backend/plustek-pp_dbg.h
+===================================================================
+--- trunk.orig/backend/plustek-pp_dbg.h
++++ trunk/backend/plustek-pp_dbg.h
+@@ -47,22 +47,11 @@
+ /* #define _ASIC_98001_SIM */
+
+ /*
+- * the print macros
+- */
+-#ifdef __KERNEL__
+-# define _PRINT printk
+-#endif
+-
+-/*
+ * some debug definitions
+ */
+ #ifdef DEBUG
+-# ifndef __KERNEL__
+ # include <assert.h>
+ # define _ASSERT(x) assert(x)
+-# else
+-# define _ASSERT(x)
+-# endif
+
+ # ifndef DBG
+ # define DBG(level, msg, args...) if ((dbg_level) & (level)) { \
+Index: trunk/backend/plustek-pp_detect.c
+===================================================================
+--- trunk.orig/backend/plustek-pp_detect.c
++++ trunk/backend/plustek-pp_detect.c
+@@ -97,11 +97,6 @@ static int detectScannerConnection( pSca
+ UChar data, control, status;
+ int retval = _E_NO_CONN;
+
+-#ifdef __KERNEL__
+- DBG( DBG_LOW, "Dataport = 0x%04x\n", ps->IO.pbSppDataPort );
+- DBG( DBG_LOW, "Ctrlport = 0x%04x\n", ps->IO.pbControlPort );
+-#endif
+-
+ detectResetPort( ps );
+
+ /*
+@@ -177,11 +172,7 @@ static int detectScannerConnection( pSca
+
+ /* work on the result */
+ if ( _OK == retval ) {
+-#ifdef __KERNEL__
+- ps->sCaps.wIOBase = ps->IO.pbSppDataPort;
+-#else
+ ps->sCaps.wIOBase = ps->pardev;
+-#endif
+ ps->PutToIdleMode( ps );
+
+ } else {
+@@ -209,11 +200,7 @@ static int detectSetupBuffers( pScanData
+ */
+ if ( 0 == ps->TotalBufferRequire ) {
+
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv: asic 0x%x probably not supported\n", ps->sCaps.AsicID);
+
+ return _E_ALLOC; /* Out of memory */
+@@ -228,11 +215,7 @@ static int detectSetupBuffers( pScanData
+
+ if ( NULL == ps->driverbuf ) {
+
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv: Not enough kernel memory %d\n",
+ ps->TotalBufferRequire);
+ return _E_ALLOC; /* Out of memory */
+@@ -380,11 +363,7 @@ static int detectAsic98001( pScanData ps
+
+ return detectScannerConnection( ps );
+ #else
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "!!!! WARNING, have a look at function detectAsic98001() !!!!\n" );
+ ps->sCaps.AsicID = _ASIC_IS_98001;
+ ps->sCaps.wIOBase = ps->IO.pbSppDataPort;
+@@ -434,11 +413,7 @@ _LOC int DetectScanner( pScanData ps, in
+
+ /* read Register 0x18 (AsicID Register) of Asic9800x based devices */
+ #ifdef _ASIC_98001_SIM
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "!!!! WARNING, SW-Emulation active !!!!\n" );
+ asic = _ASIC_IS_98001;
+ #else
+Index: trunk/backend/plustek-pp_hwdefs.h
+===================================================================
+--- trunk.orig/backend/plustek-pp_hwdefs.h
++++ trunk/backend/plustek-pp_hwdefs.h
+@@ -586,19 +586,6 @@ typedef struct
+ * structure to hold IO port specific stuff
+ */
+ typedef struct {
+-
+-#ifdef __KERNEL__
+- pFnOut fnOut;
+- pFnIn fnIn;
+-
+- UShort pbSppDataPort;
+- UShort pbEppDataPort;
+-
+- UShort pbStatusPort;
+- UShort pbControlPort;
+- UShort pbAddrOffsetPort;
+-#endif
+-
+ UShort portBase;
+ UShort portMode;
+ UShort lastPortMode;
+Index: trunk/backend/plustek-pp_image.c
+===================================================================
+--- trunk.orig/backend/plustek-pp_image.c
++++ trunk/backend/plustek-pp_image.c
+@@ -1288,11 +1288,7 @@ static Bool imageP98003ReadOneImageLine(
+
+ } while( !MiscCheckTimer( &timer ));
+
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "Timeout - Scanner malfunction !!\n" );
+ MotorToHomePosition(ps);
+
+Index: trunk/backend/plustek-pp_io.c
+===================================================================
+--- trunk.orig/backend/plustek-pp_io.c
++++ trunk/backend/plustek-pp_io.c
+@@ -257,21 +257,11 @@ static Bool fnEPPRead( pScanData ps, pUC
+
+ if( _IS_ASIC98(ps->sCaps.AsicID)) {
+
+-#ifndef __KERNEL__
+ sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAIN );
+-#else
+- _OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
+- _DO_UDELAY( 1 );
+-#endif
+ for( i = 0; i < ulSize; i++ )
+ pBuffer[i] = _INB_EPPDATA( ps );
+
+-#ifndef __KERNEL__
+ sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
+-#else
+- _OUTB_CTRL( ps, _CTRL_GENSIGNAL );
+- _DO_UDELAY( 1 );
+-#endif
+ } else {
+
+ for( i = 0; i < ulSize; i++ )
+@@ -290,18 +280,12 @@ static Bool fnBiDirRead( pScanData ps, p
+ start = _CTRL_START_BIDIREAD;
+ end = _CTRL_END_BIDIREAD;
+
+-#ifndef __KERNEL__
+ sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAIN );
+
+ if( !sanei_pp_uses_directio()) {
+ start &= ~_CTRL_DIRECTION;
+ end &= ~_CTRL_DIRECTION;
+ }
+-#else
+- if( _IS_ASIC98(ps->sCaps.AsicID)) {
+- _OUTB_CTRL( ps, (_CTRL_GENSIGNAL + _CTRL_DIRECTION));
+- }
+-#endif
+
+ switch( ps->IO.delay ) {
+
+@@ -341,13 +325,7 @@ static Bool fnBiDirRead( pScanData ps, p
+
+ }
+
+-#ifndef __KERNEL__
+ sanei_pp_set_datadir( ps->pardev, SANEI_PP_DATAOUT );
+-#else
+- if( _IS_ASIC98(ps->sCaps.AsicID)) {
+- _OUTB_CTRL( ps, _CTRL_GENSIGNAL );
+- }
+-#endif
+ return _TRUE;
+ }
+
+@@ -953,45 +931,4 @@ _LOC void IOReadScannerImageData( pScanD
+ ps->OpenScanPath( ps );
+ }
+
+-#ifdef __KERNEL__
+-
+-/** the wrapper functions to support delayed and non-delayed I/O
+- */
+-_LOC void IOOut( Byte data, UShort port )
+-{
+- DBG( DBG_IOF, "outb(0x%04x, 0x%02x)\n", port, data );
+- outb( data, port );
+-}
+-
+-_LOC void IOOutDelayed( Byte data, UShort port )
+-{
+- DBG( DBG_IOF, "outb_p(0x%04x, 0x%02x)\n", port, data );
+- outb_p( data, port );
+-}
+-
+-_LOC Byte IOIn( UShort port )
+-{
+-#ifdef DEBUG
+- Byte data = inb( port );
+-
+- DBG( DBG_IOF, "inb(0x%04x) = 0x%02x\n", port, data );
+- return data;
+-#else
+- return inb( port );
+-#endif
+-}
+-
+-_LOC Byte IOInDelayed( UShort port )
+-{
+-#ifdef DEBUG
+- Byte data = inb_p( port );
+-
+- DBG( DBG_IOF, "inb_p(0x%04x) = 0x%02x\n", port, data );
+- return data;
+-#else
+- return inb_p( port );
+-#endif
+-}
+-#endif /* guard __KERNEL__ */
+-
+ /* END PLUSTEK-PP_IO.C ......................................................*/
+Index: trunk/backend/plustek-pp_misc.c
+===================================================================
+--- trunk.orig/backend/plustek-pp_misc.c
++++ trunk/backend/plustek-pp_misc.c
+@@ -77,27 +77,11 @@
+
+ /*************************** some definitions ********************************/
+
+-#ifndef __KERNEL__
+ # define PPA_PROBE_SPP 0x0001
+ # define PPA_PROBE_PS2 0x0002
+ # define PPA_PROBE_ECR 0x0010
+ # define PPA_PROBE_EPP17 0x0100
+ # define PPA_PROBE_EPP19 0x0200
+-#else
+-
+-/* the parport driver in Kernel 2.4 has changed. It does report the
+- * possible modes in a different, more general way. As long, as
+- * we do not use the parport-module change mode facility, I assume
+- * the following correlations
+- */
+-#if defined LINUX_24 || defined LINUX_26
+-# define PARPORT_MODE_PCPS2 PARPORT_MODE_TRISTATE
+-# define PARPORT_MODE_PCEPP PARPORT_MODE_EPP
+-# define PARPORT_MODE_PCECPPS2 PARPORT_MODE_TRISTATE
+-# define PARPORT_MODE_PCECPEPP PARPORT_MODE_EPP
+-# define PARPORT_MODE_PCECR PARPORT_MODE_ECP
+-#endif
+-#endif
+
+ #define _PP_A 16807 /**< multiplier */
+ #define _PP_M 2147483647L /**< 2**31 - 1 */
+@@ -107,298 +91,10 @@
+ static int port_feature = 0;
+ static long randomnum = 1;
+
+-#ifdef __KERNEL__
+-static int portIsClaimed[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
+-
+-MODELSTR; /**< a static char array (see plustek-pp.h) */
+-
+-#else
+ static int portIsClaimed[_MAX_PTDEVS] = { 0, 0, 0, 0 };
+-#endif
+
+ /*************************** local functions *********************************/
+
+-#ifdef __KERNEL__
+-#ifdef LINUX_26
+-
+-static pScanData __ps = NULL;
+-static int __pa = -1;
+-
+-/** callback from parport driver
+- */
+-static void misc_attach(struct parport *port)
+-{
+- DBG( DBG_LOW, "misc_attach\n" );
+-
+- __ps->pp = NULL;
+- if( port->base == (unsigned long)__pa ) {
+- DBG( DBG_LOW, "Requested port (0x%02x) found\n", __pa );
+- DBG( DBG_LOW, "Port mode reported: (0x%04x)\n", port->modes );
+- __ps->pp = port;
+- }
+-}
+-
+-static void misc_detach( struct parport *port )
+-{
+- DBG( DBG_LOW, "misc_detach\n" );
+-}
+-
+-static struct parport_driver pt_drv = {
+- .name = "pt_drv",
+- .attach = misc_attach,
+- .detach = misc_detach,
+-};
+-#endif
+-
+-/** display the available port-modes
+- */
+-#ifdef DEBUG
+-static void miscShowPortModes( int modes )
+-{
+- DBG( DBG_LOW, "parport-modi:" );
+-
+- if( modes & PARPORT_MODE_PCSPP )
+- DBG( DBG_LOW, " SPP" );
+-
+- if( modes & PARPORT_MODE_PCPS2 )
+- DBG( DBG_LOW, " PS/2" );
+-
+- if( modes & PARPORT_MODE_PCEPP )
+- DBG( DBG_LOW, " EPP" );
+-
+- if( modes & PARPORT_MODE_PCECR )
+- DBG( DBG_LOW, " ECP" );
+-
+- if( modes & PARPORT_MODE_PCECPEPP )
+- DBG( DBG_LOW, " EPP(ECP)" );
+-
+- if( modes & PARPORT_MODE_PCECPPS2 )
+- DBG( DBG_LOW, " PS/2(ECP)" );
+-
+- DBG( DBG_LOW, "\n" );
+-}
+-#endif
+-
+-/** probe the parallel port
+- */
+-static int initPortProbe( pScanData ps )
+-{
+- int retv = 0;
+-
+- /* clear the controls */
+- ps->IO.lastPortMode = 0xFFFF;
+-
+- if( NULL != ps->pardev )
+- retv = ps->pardev->port->modes;
+- return retv;
+-}
+-
+-/** will be called by the parport module when we already have access, but
+- * another module wants access to the port...
+- */
+-static int miscPreemptionCallback( pVoid data )
+-{
+- pScanData ps = (pScanData)data;
+-
+- if( NULL != ps ) {
+-
+- /* never release during scanning */
+- if( ps->DataInf.dwScanFlag & _SCANNER_SCANNING ) {
+- DBG( DBG_LOW, "no way!!!\n" );
+- return 1;
+- }
+- }
+-
+- /* let the port go...*/
+- return 0;
+-}
+-
+-/** depending on the reported possible port modes, we try to set a faster mode
+- * than SPP
+- */
+-static int miscSetFastMode( pScanData ps )
+-{
+- UChar a, b;
+-
+- /*
+- * when previously found the EPP mode, break right here
+- */
+- if (( _PORT_EPP == ps->IO.portMode ) && (!(port_feature & PARPORT_MODE_PCECR)))
+- return _OK;
+-
+- /* CHECK REMOVE: from here we should have SPP (Paranoia Code !) */
+- if (( _PORT_SPP != ps->IO.portMode ) && (!(port_feature & PARPORT_MODE_PCECR)))
+- return _OK;
+-
+- DBG(DBG_LOW, "Trying faster mode...\n" );
+-
+- /*
+- * ECP mode usually has sub-modes of EPP and/or PS2.
+- * First we try to set EPP
+- */
+- if((port_feature & PARPORT_MODE_PCECR) &&
+- (port_feature & PARPORT_MODE_PCECPEPP)){
+-
+- DBG(DBG_LOW, "Attempting to set EPP from ECP mode.\n" );
+-
+- a = _INB_ECTL(ps); /* get current ECR */
+- ps->IO.lastPortMode = a; /* save it for restoring later */
+- a = (a & 0x1F) | 0x80; /* set to EPP */
+- _OUTB_ECTL(ps, a); /* write it back */
+- _DO_UDELAY(1);
+-
+- /*
+- * It is probably unnecessary to
+- * do this check but it makes me feel better
+- */
+- b = _INB_ECTL(ps); /* check to see if port set */
+- if( a == b ) {
+- DBG( DBG_LOW, "Port is set to (ECP) EPP mode.\n" );
+- ps->IO.portMode = _PORT_EPP;
+- return _OK;
+-
+- } else {
+- DBG( DBG_LOW, "Port could not be set to (ECP) EPP mode. "
+- "Using SPP mode.\n" );
+- _OUTB_ECTL(ps,(Byte)ps->IO.lastPortMode); /* restore */
+- _DO_UDELAY(1);
+- ps->IO.portMode = _PORT_SPP;
+-
+- /* go ahead and try with other settings...*/
+- }
+- }
+-
+- /* If port cannot be set to EPP, try PS2 */
+- if((port_feature & PARPORT_MODE_PCECR) &&
+- (port_feature & PARPORT_MODE_PCECPPS2)) {
+-
+- DBG(DBG_LOW, "Attempting to set PS2 from ECPPS2 mode.\n" );
+-
+- a = _INB_ECTL(ps); /* get current ECR */
+- ps->IO.lastPortMode = a; /* save it for restoring later */
+-
+- /* set to Fast Centronics/bi-directional/PS2 */
+- a = (a & 0x1F) | 0x20;
+- _OUTB_ECTL(ps,a); /* write it back */
+- _DO_UDELAY(1);
+-
+- /*
+- * It is probably unnecessary to do this check
+- * but it makes me feel better
+- */
+- b = _INB_ECTL(ps); /* check to see if port set */
+- if (a == b) {
+- DBG(DBG_LOW, "Port is set to (ECP) PS2 bidirectional mode.\n");
+- ps->IO.portMode = _PORT_BIDI;
+- return _OK;
+- } else {
+- DBG(DBG_LOW, "Port could not be set to (ECP) PS2 mode. "
+- "Using SPP mode.\n");
+- a = ps->IO.lastPortMode & 0x1F;
+- _OUTB_ECTL(ps, a); /* set ECP ctrl to SPP */
+- _DO_UDELAY(1);
+- ps->IO.portMode = _PORT_SPP;
+-
+- /* next mode, last attempt... */
+- }
+- }
+-
+- /*
+- * Some BIOS/cards have only a Bi-directional/PS2 mode (no EPP).
+- * Make one last attempt to set to PS2 mode.
+- */
+- if ( port_feature & PARPORT_MODE_PCPS2 ){
+-
+- DBG(DBG_LOW, "Attempting to set PS2 mode.\n" );
+-
+- a = _INB_CTRL(ps); /* get current setting of control register*/
+- ps->IO.lastPortMode = a; /* save it for restoring later */
+- a = a | 0x20; /* set bit 5 of control reg */
+- _OUTB_CTRL(ps,a); /* set to Fast Centronics/bi-directional/PS2 */
+- _DO_UDELAY(1);
+- a = 0;
+-
+- _OUTB_DATA(ps,0x55);
+- _DO_UDELAY(1);
+- if ((inb(ps->IO.portBase)) != 0x55) /* read data */
+- a++;
+-
+- _OUTB_DATA(ps,0xAA);
+- _DO_UDELAY(1);
+-
+- if (_INB_DATA(ps) != 0xAA) /* read data */
+- a++;
+-
+- if( 2 == a ) {
+- DBG(DBG_LOW, "Port is set to PS2 bidirectional mode.\n");
+- ps->IO.portMode = _PORT_BIDI;
+- return _OK;
+-
+- } else {
+- DBG(DBG_LOW, "Port could not be set to PS2 mode. "
+- "Using SPP mode.\n");
+- _OUTB_CTRL(ps,(Byte)ps->IO.lastPortMode); /* restore */
+- _DO_UDELAY(1);
+- ps->IO.portMode = _PORT_SPP;
+- }
+- }
+-
+- /* reaching this point, we're back in SPP mode and there's no need
+- * to restore at shutdown...
+- */
+- ps->IO.lastPortMode = 0xFFFF;
+-
+- return _OK;
+-}
+-
+-/** check the state of the par-port and switch to EPP-mode if possible
+- */
+-static int miscSetPortMode( pScanData ps )
+-{
+- /* try to detect the port settings, SPP seems to work in any case ! */
+- port_feature = initPortProbe( ps );
+-
+-#ifdef DEBUG
+- miscShowPortModes( port_feature );
+-#endif
+-
+- switch( ps->IO.forceMode ) {
+-
+- case 1:
+- DBG( DBG_LOW, "Use of SPP-mode enforced\n" );
+- ps->IO.portMode = _PORT_SPP;
+- return _OK;
+- break;
+-
+- case 2:
+- DBG( DBG_LOW, "Use of EPP-mode enforced\n" );
+- ps->IO.portMode = _PORT_EPP;
+- return _OK;
+- break;
+-
+- default:
+- break;
+- }
+-
+- if( !(port_feature & PARPORT_MODE_PCEPP)) {
+-
+- if( !(port_feature & PARPORT_MODE_PCSPP )) {
+- _PRINT("\nThis Port supports not the SPP- or EPP-Mode\n" );
+- _PRINT("Please activate SPP-Mode, EPP-Mode or\nEPP + ECP-Mode!\n");
+- return _E_NOSUPP;
+- } else {
+- DBG(DBG_LOW, "Using SPP-mode\n" );
+- ps->IO.portMode = _PORT_SPP;
+- }
+- } else {
+- DBG(DBG_LOW, "Using EPP-mode\n" );
+- ps->IO.portMode = _PORT_EPP;
+- }
+-
+- /* else try to set to a faster mode than SPP */
+- return miscSetFastMode( ps );
+-}
+-#endif
+
+ /** miscNextLongRand() -- generate 2**31-2 random numbers
+ **
+@@ -488,34 +184,6 @@ _LOC int MiscReinitStruct( pScanData ps
+ */
+ _LOC int MiscInitPorts( pScanData ps, int port )
+ {
+-#ifdef __KERNEL__
+- int status;
+-
+- if( NULL == ps )
+- return _E_NULLPTR;
+-
+- /*
+- * Get access to the ports
+- */
+- ps->IO.portBase = (UShort)port;
+-
+- status = miscSetPortMode(ps);
+-
+- if( _OK != status ) {
+- ps->sCaps.wIOBase = _NO_BASE;
+- ps->IO.portBase = _NO_BASE;
+- return status;
+- }
+-
+- /*
+- * the port settings
+- */
+- ps->IO.pbSppDataPort = (UShort)port;
+- ps->IO.pbStatusPort = (UShort)port+1;
+- ps->IO.pbControlPort = (UShort)port+2;
+- ps->IO.pbEppDataPort = (UShort)port+4;
+-
+-#else
+ int mode, mts;
+
+ if( NULL == ps )
+@@ -560,7 +228,6 @@ _LOC int MiscInitPorts( pScanData ps, in
+
+ sanei_pp_setmode( ps->pardev, mts );
+ _VAR_NOT_USED( port );
+-#endif
+ return _OK;
+ }
+
+@@ -568,11 +235,6 @@ _LOC int MiscInitPorts( pScanData ps, in
+ */
+ _LOC void MiscRestorePort( pScanData ps )
+ {
+-#ifdef __KERNEL__
+- if( 0 == ps->IO.pbSppDataPort )
+- return;
+-#endif
+-
+ DBG(DBG_LOW,"MiscRestorePort()\n");
+
+ /* don't restore if not necessary */
+@@ -582,19 +244,9 @@ _LOC void MiscRestorePort( pScanData ps
+ }
+
+ /*Restore Port-Mode*/
+-#ifdef __KERNEL__
+- if( port_feature & PARPORT_MODE_PCECR ){
+- _OUTB_ECTL( ps, (Byte)ps->IO.lastPortMode );
+- _DO_UDELAY(1);
+- } else {
+- _OUTB_CTRL( ps, (Byte)ps->IO.lastPortMode );
+- _DO_UDELAY(1);
+- }
+-#else
+ if( port_feature & PPA_PROBE_ECR ){
+ _OUTB_ECTL(ps,ps->IO.lastPortMode);
+ }
+-#endif
+ }
+
+ /** Initializes a timer.
+@@ -605,11 +257,7 @@ _LOC void MiscStartTimer( TimerDef *time
+ {
+ struct timeval start_time;
+
+-#ifdef __KERNEL__
+- _GET_TIME( &start_time );
+-#else
+ gettimeofday(&start_time, NULL);
+-#endif
+
+ *timer = (TimerDef)start_time.tv_sec * 1000000 + (TimerDef)start_time.tv_usec + us;
+ }
+@@ -624,21 +272,14 @@ _LOC int MiscCheckTimer( TimerDef *timer
+ {
+ struct timeval current_time;
+
+-#ifdef __KERNEL__
+- _GET_TIME( &current_time );
+-#else
+ gettimeofday(&current_time, NULL);
+-#endif
+
+ if ((TimerDef)current_time.tv_sec * 1000000 + (TimerDef)current_time.tv_usec > *timer) {
+ return _E_TIMEOUT;
+ } else {
+-#ifdef __KERNEL__
+- schedule();
+ /*#else
+ sched_yield();
+ */
+-#endif
+ return _OK;
+ }
+ }
+@@ -673,65 +314,8 @@ _LOC Bool MiscAllPointersSet( pScanData
+ */
+ _LOC int MiscRegisterPort( pScanData ps, int portAddr )
+ {
+-#ifndef __KERNEL__
+ DBG( DBG_LOW, "Assigning port handle %i\n", portAddr );
+ ps->pardev = portAddr;
+-#else
+-
+-#ifdef LINUX_26
+- __ps = ps;
+- __pa = portAddr;
+-
+- DBG( DBG_LOW, "Requested port at 0x%02x\n", portAddr );
+-
+- if( parport_register_driver(&pt_drv)) {
+- /* Failed; nothing we can do. */
+- return _E_REGISTER;
+- }
+-
+-#else
+- struct parport *pp = NULL;
+-
+- DBG( DBG_LOW, "Requested port at 0x%02x\n", portAddr );
+-
+- pp = parport_enumerate();
+- ps->pardev = NULL;
+-
+- if( NULL == pp ) {
+- return _E_PORTSEARCH;
+- }
+-
+- /* go through the list
+- */
+- for( ps->pp = NULL; NULL != pp; ) {
+-
+- if( pp->base == (unsigned long)portAddr ) {
+- DBG( DBG_LOW, "Requested port (0x%02x) found\n", portAddr );
+- DBG( DBG_LOW, "Port mode reported: (0x%04x)\n", pp->modes );
+- ps->pp = pp;
+- break;
+- }
+- pp = pp->next;
+- }
+-#endif
+-
+- if( NULL == ps->pp ) {
+- printk("PORT not found!!!\n");
+- return _E_NO_PORT;
+- }
+-
+- /*
+- * register this device
+- */
+- ps->pardev = parport_register_device( ps->pp, "Plustek Driver",
+- miscPreemptionCallback, NULL, NULL, 0, (pVoid)ps );
+-
+- if( NULL == ps->pardev ) {
+- return _E_REGISTER;
+- }
+-
+- DBG( DBG_LOW, "Port for device %u registered\n", ps->devno );
+-#endif
+
+ portIsClaimed[ps->devno] = 0;
+ return _OK;
+@@ -741,17 +325,7 @@ _LOC int MiscRegisterPort( pScanData ps,
+ */
+ _LOC void MiscUnregisterPort( pScanData ps )
+ {
+-#ifdef __KERNEL__
+- if( NULL != ps->pardev ) {
+- DBG( DBG_LOW, "Port unregistered\n" );
+- parport_unregister_device( ps->pardev );
+- }
+-#ifdef LINUX_26
+- parport_unregister_driver( &pt_drv );
+-#endif
+-#else
+ sanei_pp_close( ps->pardev );
+-#endif
+ }
+
+ /** Try to claim the port
+@@ -763,11 +337,7 @@ _LOC int MiscClaimPort( pScanData ps )
+ if( 0 == portIsClaimed[ps->devno] ) {
+
+ DBG( DBG_HIGH, "Try to claim the parport\n" );
+-#ifdef __KERNEL__
+- if( 0 != parport_claim( ps->pardev )) {
+-#else
+ if( SANE_STATUS_GOOD != sanei_pp_claim( ps->pardev )) {
+-#endif
+ return _E_BUSY;
+ }
+ }
+@@ -785,11 +355,7 @@ _LOC void MiscReleasePort( pScanData ps
+
+ if( 0 == portIsClaimed[ps->devno] ) {
+ DBG( DBG_HIGH, "Releasing parport\n" );
+-#ifdef __KERNEL__
+- parport_release( ps->pardev );
+-#else
+ sanei_pp_release( ps->pardev );
+-#endif
+ }
+ }
+ }
+Index: trunk/backend/plustek-pp_procs.h
+===================================================================
+--- trunk.orig/backend/plustek-pp_procs.h
++++ trunk/backend/plustek-pp_procs.h
+@@ -219,13 +219,6 @@ _LOC void IORegisterDirectToScanner( pSc
+ _LOC void IOSoftwareReset ( pScanData ps );
+ _LOC void IOReadScannerImageData ( pScanData ps, pUChar pBuf, ULong size );
+
+-#ifdef __KERNEL__
+-_LOC void IOOut ( Byte data, UShort port );
+-_LOC void IOOutDelayed( Byte data, UShort port );
+-_LOC Byte IOIn ( UShort port );
+-_LOC Byte IOInDelayed ( UShort port );
+-#endif
+-
+ /*
+ * implementation in plustek-pp_tpa.c
+ */
+@@ -238,16 +231,6 @@ _LOC void TPAP98003Reshading ( p
+ */
+ _LOC void ScaleX( pScanData ps, pUChar inBuf, pUChar outBuf );
+
+-/*
+- * implementation in plustek-pp_procfs.c (Kernel-mode only)
+- */
+-#ifdef __KERNEL__
+-int ProcFsInitialize ( void );
+-void ProcFsShutdown ( void );
+-void ProcFsRegisterDevice ( pScanData ps );
+-void ProcFsUnregisterDevice( pScanData ps );
+-#endif
+-
+ #endif /* guard __PROCS_H__ */
+
+ /* END PLUSTEK-PP_PROCS.H ...................................................*/
+Index: trunk/backend/plustek-pp_ptdrv.c
+===================================================================
+--- trunk.orig/backend/plustek-pp_ptdrv.c
++++ trunk/backend/plustek-pp_ptdrv.c
+@@ -94,52 +94,13 @@
+ * If you do not wish that, delete this exception notice.
+ * <hr>
+ */
+-#ifdef __KERNEL__
+-# include <linux/module.h>
+-# include <linux/version.h>
+-
+-# ifdef CONFIG_DEVFS_FS
+-# include <linux/devfs_fs_kernel.h>
+-# if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,69))
+-# define DEVFS_26_STYLE
+-# endif
+-# endif
+-#endif
+-
+ #include "plustek-pp_scan.h"
+
+-#ifdef __KERNEL__
+-# include <linux/param.h>
+-#endif
+-
+ /****************************** static vars **********************************/
+
+ /* default port is at 0x378 */
+ static int port[_MAX_PTDEVS] = { 0x378, 0, 0, 0 };
+
+-#ifdef __KERNEL__
+-static pScanData PtDrvDevices[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = NULL};
+-
+-/* default is 180 secs for lamp switch off */
+-static int lampoff[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 180 };
+-
+-/* warmup period for lamp (30 secs) */
+-static int warmup[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 30 };
+-
+-/* switch lamp off on unload (default = no)*/
+-static int lOffonEnd[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
+-
+-/* model override (0-->none) */
+-static UShort mov[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
+-
+-/* forceMode (0--> auto, 1: SPP, 2:EPP, others: auto) */
+-static UShort forceMode[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = 0 };
+-
+-/* to use delayed I/O for each device */
+-static Bool slowIO[_MAX_PTDEVS] = { [0 ... (_MAX_PTDEVS-1)] = _FALSE };
+-
+-#else
+-
+ static pScanData PtDrvDevices[_MAX_PTDEVS]= { NULL, NULL, NULL, NULL };
+ static int lampoff[_MAX_PTDEVS] = { 180, 180, 180, 180 };
+ static int warmup[_MAX_PTDEVS] = { 30, 30, 30, 30 };
+@@ -147,140 +108,14 @@ static int lOffonEnd[_MAX_PTDEVS]
+ static UShort mov[_MAX_PTDEVS] = { 0, 0, 0, 0 };
+ static UShort forceMode[_MAX_PTDEVS] = { 0, 0, 0, 0 };
+
+-#endif
+-
+ /* timers for warmup checks */
+ static TimerDef toTimer[_MAX_PTDEVS];
+
+-#ifndef __KERNEL__
+ static Bool PtDrvInitialized = _FALSE;
+ #ifdef HAVE_SETITIMER
+ static struct itimerval saveSettings;
+ #endif
+-#else
+-static Bool deviceScanning = _FALSE;
+-
+-static struct timer_list tl[_MAX_PTDEVS];
+-
+-/* for calculation of the timer expiration */
+-extern volatile unsigned long jiffies;
+-
+-/* the parameter interface
+- */
+-#if ((LINUX_VERSION_CODE > 0x020111) && defined(MODULE))
+-MODULE_AUTHOR("Gerhard Jaeger <gerhard@gjaeger.de>");
+-MODULE_DESCRIPTION("Plustek parallelport-scanner driver");
+-
+-/* addresses this 'new' license feature... */
+-#ifdef MODULE_LICENSE
+-MODULE_LICENSE("GPL");
+-#endif
+-
+-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,13))
+-MODULE_PARM(port, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(lampoff, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(warmup,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(lOffonEnd, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(mov, "1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(slowIO,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-MODULE_PARM(forceMode,"1-" __MODULE_STRING(_MAX_PTDEVS) "i");
+-
+-#else
+-
+-static int array_len = _MAX_PTDEVS;
+-
+-module_param_array(port, int, &array_len, 0);
+-module_param_array(lampoff, int, &array_len, 0);
+-module_param_array(warmup, int, &array_len, 0);
+-module_param_array(lOffonEnd, int, &array_len, 0);
+-module_param_array(mov, ushort, &array_len, 0);
+-module_param_array(slowIO, int, &array_len, 0);
+-module_param_array(forceMode, ushort, &array_len, 0);
+-
+-#endif
+-
+-
+-MODULE_PARM_DESC(port, "I/O base address of parport");
+-MODULE_PARM_DESC(lampoff, "Lamp-Off timer preset in seconds");
+-MODULE_PARM_DESC(warmup, "Minimum warmup time in seconds");
+-MODULE_PARM_DESC(lOffonEnd, "1 - switchoff lamp on unload");
+-MODULE_PARM_DESC(mov, "Modell-override switch");
+-MODULE_PARM_DESC(slowIO, "0 = Fast I/O, 1 = Delayed I/O");
+-MODULE_PARM_DESC(forceMode, "0 = use auto detection, "
+- "1 = use SPP mode, 2 = use EPP mode");
+-#endif
+-
+-#if defined (CONFIG_DEVFS_FS)
+-# ifndef (DEVFS_26_STYLE)
+- static devfs_handle_t devfs_handle = NULL;
+-# endif
+-#else
+-# ifdef LINUX_26
+- static class_t *ptdrv_class;
+-# endif
+-#endif
+-
+-/*
+- * the module interface
+- */
+-static int pt_drv_open ( struct inode *, struct file *);
+-static CLOSETYPE pt_drv_close( struct inode *, struct file *);
+-
+-#ifdef LINUX_20
+- static int pt_drv_read( struct inode*, struct file*, char*, int );
+- static int pt_drv_write( struct inode*, struct file*, const char*, int );
+-#else
+- static ssize_t pt_drv_read ( struct file *file,
+- char *buffer, size_t count, loff_t *);
+- static ssize_t pt_drv_write( struct file *file,
+- const char *buffer, size_t tmp,loff_t *count);
+-#endif
+-
+-#ifdef NOLOCK_IOCTL
+- static long pt_drv_ioctl( struct file *, UInt, unsigned long );
+-#else
+- static int pt_drv_ioctl( struct inode *, struct file *, UInt, unsigned long );
+-#endif
+-
+-
+-/*
+- * the driver interface
+- */
+-#ifdef LINUX_20
+-
+-static struct file_operations pt_drv_fops =
+-{
+- NULL, /* seek */
+- pt_drv_read, /* read */
+- pt_drv_write, /* write */
+- NULL, /* readdir */
+- NULL, /* select */
+- pt_drv_ioctl, /* ioctl */
+- NULL, /* mmap */
+- pt_drv_open, /* open */
+- pt_drv_close, /* release */
+- NULL, /* fsync */
+- NULL, /* fasync */
+- NULL, /* check_media_change */
+- NULL /* revalidate */
+-};
+-
+-#else /* 2.2.x and higher stuff */
+-
+-static struct file_operations pt_drv_fops = {
+-#ifdef LINUX_24
+- owner: THIS_MODULE,
+-#endif
+- read: pt_drv_read,
+- write: pt_drv_write,
+- IOCTL: pt_drv_ioctl,
+- open: pt_drv_open,
+- release: pt_drv_close,
+-};
+
+-#endif
+-
+-#endif /* guard __KERNEL */
+
+ /****************************** some prototypes ******************************/
+
+@@ -288,23 +123,6 @@ static void ptdrvStartLampTimer( pScanDa
+
+ /****************************** local functions ******************************/
+
+-#ifdef __KERNEL__
+-/** depending on the device, return the data structure
+- */
+-static pScanData get_pt_from_inode(struct inode *ip)
+-{
+- int minor = _MINOR(ip);
+-
+- /*
+- * unit out of range
+- */
+- if (minor >= _MAX_PTDEVS )
+- return NULL;
+-
+- return( PtDrvDevices[minor] );
+-}
+-#endif
+-
+ /** copy user-space data into kernel memory
+ */
+ static int getUserPtr(const pVoid useraddr, pVoid where, UInt size )
+@@ -315,32 +133,9 @@ static int getUserPtr(const pVoid userad
+ if((NULL == useraddr) || ( 0 == size))
+ return _E_INVALID;
+
+-#ifdef __KERNEL__
+- if ((err = verify_area_20(VERIFY_READ, useraddr, size)))
+- return err;
+-#endif
+-
+ switch (size) {
+-#ifdef __KERNEL__
+- case sizeof(u_char):
+- GET_USER_RET(*(u_char *)where, (u_char *) useraddr, -EFAULT);
+- break;
+-
+- case sizeof(u_short):
+- GET_USER_RET(*(u_short *)where, (u_short *) useraddr, -EFAULT);
+- break;
+-
+- case sizeof(u_long):
+- GET_USER_RET(*(u_long *)where, (u_long *) useraddr, -EFAULT);
+- break;
+-
+- default:
+- if (copy_from_user(where, useraddr, size))
+- return -EFAULT;
+-#else
+ default:
+ memcpy( where, useraddr, size );
+-#endif
+ }
+ return err;
+ }
+@@ -354,20 +149,11 @@ static int putUserPtr( const pVoid ptr,
+ if (NULL == useraddr)
+ return _E_INVALID;
+
+-#ifdef __KERNEL__
+- if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
+- return err;
+-
+- if (copy_to_user(useraddr, ptr, size ))
+- return -EFAULT;
+-#else
+ memcpy( useraddr, ptr, size );
+-#endif
+
+ return err;
+ }
+
+-#ifndef __KERNEL__
+ static unsigned long copy_from_user( pVoid dest, pVoid src, unsigned long len )
+ {
+ memcpy( dest, src, len );
+@@ -379,37 +165,16 @@ static unsigned long copy_to_user( pVoid
+ memcpy( dest, src, len );
+ return 0;
+ }
+-#endif
+
+ /**
+ */
+ static int putUserVal(const ULong value, pVoid useraddr, UInt size)
+ {
+-#ifdef __KERNEL__
+- int err;
+-#endif
+-
+ if (NULL == useraddr)
+ return _E_INVALID;
+
+-#ifdef __KERNEL__
+- if ((err = verify_area_20(VERIFY_WRITE, useraddr, size)))
+- return err;
+-#endif
+-
+ switch (size) {
+
+-#ifdef __KERNEL__
+- case sizeof(u_char):
+- PUT_USER_RET((u_char)value, (u_char *) useraddr, -EFAULT);
+- break;
+- case sizeof(u_short):
+- PUT_USER_RET((u_short)value, (u_short *) useraddr, -EFAULT);
+- break;
+- case sizeof(u_long):
+- PUT_USER_RET((u_long)value, (u_long *) useraddr, -EFAULT);
+- break;
+-#else
+ case sizeof(UChar):
+ *(pUChar)useraddr = (UChar)value;
+ break;
+@@ -420,7 +185,6 @@ static int putUserVal(const ULong value,
+ *(pULong)useraddr = (ULong)value;
+ break;
+
+-#endif
+ default:
+ return _E_INVALID;
+ }
+@@ -506,22 +270,14 @@ static void ptdrvLampWarmup( pScanData p
+
+ /**
+ */
+-#ifdef __KERNEL__
+-static void ptdrvLampTimerIrq( unsigned long ptr )
+-#else
+ static void ptdrvLampTimerIrq( int sig_num )
+-#endif
+ {
+ pScanData ps;
+
+ DBG( DBG_HIGH, "!! IRQ !! Lamp-Timer stopped.\n" );
+
+-#ifdef __KERNEL__
+- ps = (pScanData)ptr;
+-#else
+ _VAR_NOT_USED( sig_num );
+ ps = PtDrvDevices[0];
+-#endif
+
+ /*
+ * paranoia check!
+@@ -559,7 +315,6 @@ static void ptdrvLampTimerIrq( int sig_n
+ */
+ static void ptdrvStartLampTimer( pScanData ps )
+ {
+-#ifndef __KERNEL__
+ sigset_t block, pause_mask;
+ struct sigaction s;
+ #ifdef HAVE_SETITIMER
+@@ -597,17 +352,6 @@ static void ptdrvStartLampTimer( pScanDa
+ #else
+ alarm( ps->lampoff );
+ #endif
+-#else
+- init_timer( &tl[ps->devno] );
+-
+- /* timeout val in seconds */
+- tl[ps->devno].expires = jiffies + ps->lampoff * HZ;
+- tl[ps->devno].data = (unsigned long)ps;
+- tl[ps->devno].function = ptdrvLampTimerIrq;
+-
+- if( 0 != ps->lampoff )
+- add_timer( &tl[ps->devno] );
+-#endif
+
+ DBG( DBG_HIGH, "Lamp-Timer started!\n" );
+ }
+@@ -616,7 +360,6 @@ static void ptdrvStartLampTimer( pScanDa
+ */
+ static void ptdrvStopLampTimer( pScanData ps )
+ {
+-#ifndef __KERNEL__
+ sigset_t block, pause_mask;
+
+ /* block SIGALRM */
+@@ -630,10 +373,6 @@ static void ptdrvStopLampTimer( pScanDat
+ _VAR_NOT_USED( ps );
+ alarm(0);
+ #endif
+-#else
+- if( 0 != ps->lampoff )
+- del_timer( &tl[ps->devno] );
+-#endif
+
+ DBG( DBG_HIGH, "Lamp-Timer stopped!\n" );
+ }
+@@ -701,23 +440,11 @@ static int ptdrvOpenDevice( pScanData ps
+ UShort lastMode;
+ ULong devno;
+
+-#ifdef __KERNEL__
+- UShort flags;
+- struct pardevice *pd;
+- struct parport *pp;
+- ProcDirDef procDir;
+-#else
+ int pd;
+-#endif
+
+ /*
+ * push some values from the struct
+ */
+-#ifdef __KERNEL__
+- flags = ps->flags;
+- pp = ps->pp;
+- procDir = ps->procDir;
+-#endif
+ pd = ps->pardev;
+ iobase = ps->sCaps.wIOBase;
+ asic = ps->sCaps.AsicID;
+@@ -734,29 +461,10 @@ static int ptdrvOpenDevice( pScanData ps
+ /*
+ * pop the val(s)
+ */
+-#ifdef __KERNEL__
+- ps->flags = flags;
+- ps->pp = pp;
+- ps->procDir = procDir;
+-#endif
+ ps->pardev = pd;
+ ps->bLastLampStatus = lastStat;
+ ps->IO.lastPortMode = lastMode;
+ ps->devno = devno;
+-
+-#ifdef __KERNEL__
+- if( _TRUE == slowIO[devno] ) {
+- DBG( DBG_LOW, "Using slow I/O\n" );
+- ps->IO.slowIO = _TRUE;
+- ps->IO.fnOut = IOOutDelayed;
+- ps->IO.fnIn = IOInDelayed;
+- } else {
+- DBG( DBG_LOW, "Using fast I/O\n" );
+- ps->IO.slowIO = _FALSE;
+- ps->IO.fnOut = IOOut;
+- ps->IO.fnIn = IOIn;
+- }
+-#endif
+ ps->ModelOverride = mov[devno];
+ ps->warmup = warmup[devno];
+ ps->lampoff = lampoff[devno];
+@@ -798,19 +506,6 @@ static int ptdrvInit( int devno )
+ return _E_ALLOC;
+ }
+
+-#ifdef __KERNEL__
+- if( _TRUE == slowIO[devno] ) {
+- DBG( DBG_LOW, "Using slow I/O\n" );
+- ps->IO.slowIO = _TRUE;
+- ps->IO.fnOut = IOOutDelayed;
+- ps->IO.fnIn = IOInDelayed;
+- } else {
+- DBG( DBG_LOW, "Using fast I/O\n" );
+- ps->IO.slowIO = _FALSE;
+- ps->IO.fnOut = IOOut;
+- ps->IO.fnIn = IOIn;
+- }
+-#endif
+ ps->ModelOverride = mov[devno];
+ ps->warmup = warmup[devno];
+ ps->lampoff = lampoff[devno];
+@@ -845,13 +540,8 @@ static int ptdrvInit( int devno )
+
+ if( _OK == retval ) {
+
+-#ifdef __KERNEL__
+- _PRINT( "pt_drv%u: %s found on port 0x%04x\n",
+- devno, MiscGetModelName(ps->sCaps.Model), ps->IO.pbSppDataPort );
+-#else
+ DBG( DBG_LOW, "pt_drv%u: %s found\n",
+ devno, MiscGetModelName(ps->sCaps.Model));
+-#endif
+
+ /*
+ * initialize the timespan timer
+@@ -859,43 +549,23 @@ static int ptdrvInit( int devno )
+ MiscStartTimer( &toTimer[ps->devno], (_SECOND * ps->warmup));
+
+ if( 0 == ps->lampoff )
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv%u: Lamp-Timer switched off.\n", devno );
+ else {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv%u: Lamp-Timer set to %u seconds.\n",
+ devno, ps->lampoff );
+ }
+
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv%u: WarmUp period set to %u seconds.\n",
+ devno, ps->warmup );
+
+ if( 0 == ps->lOffonEnd ) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv%u: Lamp untouched on driver unload.\n", devno );
+ } else {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv%u: Lamp switch-off on driver unload.\n", devno );
+ }
+
+@@ -1287,31 +957,19 @@ static int ptdrvRead( pScanData ps, pUCh
+ int retval = _OK;
+
+ #ifdef _ASIC_98001_SIM
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_LOW,
+-#endif
+ "pt_drv : Software-Emulation active, can't read!\n" );
+ return _E_INVALID;
+ #endif
+
+ if((NULL == buffer) || (NULL == ps)) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv : Internal NULL-pointer!\n" );
+ return _E_NULLPTR;
+ }
+
+ if( 0 == count ) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv%u: reading 0 bytes makes no sense!\n", ps->devno );
+ return _E_INVALID;
+ }
+@@ -1325,11 +983,7 @@ static int ptdrvRead( pScanData ps, pUCh
+ * when using the cat /dev/pt_drv command!
+ */
+ if (!(ps->DataInf.dwVxdFlag & _VF_ENVIRONMENT_READY)) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv%u: Cannot read, driver not initialized!\n",ps->devno);
+ return _E_SEQUENCE;
+ }
+@@ -1340,11 +994,7 @@ static int ptdrvRead( pScanData ps, pUCh
+ ps->Scan.bp.pMonoBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
+
+ if ( NULL == ps->Scan.bp.pMonoBuf ) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv%u: Not enough memory available!\n", ps->devno );
+ return _E_ALLOC;
+ }
+@@ -1355,11 +1005,7 @@ static int ptdrvRead( pScanData ps, pUCh
+ scaleBuf = _KALLOC( ps->DataInf.dwAppPhyBytesPerLine, GFP_KERNEL);
+ if ( NULL == scaleBuf ) {
+ _KFREE( ps->Scan.bp.pMonoBuf );
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv%u: Not enough memory available!\n", ps->devno );
+ return _E_ALLOC;
+ }
+@@ -1406,11 +1052,7 @@ static int ptdrvRead( pScanData ps, pUCh
+
+ retval = ps->Calibration( ps );
+ if( _OK != retval ) {
+-#ifdef __KERNEL__
+- _PRINT(
+-#else
+ DBG( DBG_HIGH,
+-#endif
+ "pt_drv%u: calibration failed, result = %i\n",
+ ps->devno, retval );
+ goto ReadFinished;
+@@ -1507,12 +1149,9 @@ static int ptdrvRead( pScanData ps, pUCh
+ ps->Scan.dwLinesToRead--;
+
+ /* needed, esp. to avoid freezing the system in SPP mode */
+-#ifdef __KERNEL__
+- schedule();
+ /*#else
+ sched_yield();
+ */
+-#endif
+ }
+
+ if (ps->fScanningStatus) {
+@@ -1565,346 +1204,6 @@ ReadFinished:
+ return retval;
+ }
+
+-/*************************** the module interface ****************************/
+-
+-#ifdef __KERNEL__ /* the kernel module interface */
+-
+-/* Designed to be used as a module */
+-#ifdef MODULE
+-
+-/*.............................................................................
+- * gets called upon module initialization
+- */
+-#ifdef LINUX_26
+-static int __init ptdrv_init( void )
+-#else
+-int init_module( void )
+-#endif
+-{
+- UInt devCount;
+- UInt i;
+- int retval = _OK;
+- int result = _OK;
+-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
+- char controlname[24];
+-#endif
+-# ifdef LINUX_26
+- char devname[20];
+-#endif
+-
+- DBG( DBG_HIGH, "*********************************************\n" );
+- DBG( DBG_HIGH, "pt_drv: init_module()\n" );
+-
+-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
+- devfs_handle = devfs_mk_dir(NULL, "scanner", NULL);
+- if( devfs_register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
+-#else
+- if( register_chrdev(_PTDRV_MAJOR, _DRV_NAME, &pt_drv_fops)) {
+-#endif
+-
+- _PRINT(KERN_INFO "pt_drv: unable to get major %d for pt_drv devices\n",
+- _PTDRV_MAJOR);
+- return -EIO;
+- }
+- printk( KERN_INFO "pt_drv : driver version "_PTDRV_VERSTR"\n" );
+-
+-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
+- ptdrv_class = class_create(THIS_MODULE, "scanner");
+- if (IS_ERR(ptdrv_class))
+- goto out_devfs;
+-#endif
+-
+- /* register the proc_fs */
+- ProcFsInitialize();
+-
+- /* go through the list of defined ports and try to find a device
+- */
+- devCount = 0;
+- for( i = 0; i < _MAX_PTDEVS; i++ ) {
+-
+- if( 0 != port[i] ) {
+- result = ptdrvInit( i );
+-
+- if ( _OK == result ) {
+- PtDrvDevices[i]->flags |= _PTDRV_INITALIZED;
+-
+-#ifdef CONFIG_DEVFS_FS
+-# ifndef DEVFS_26_STYLE
+- sprintf( controlname, "scanner/pt_drv%d", devCount );
+- devfs_register( NULL, controlname,
+- DEVFS_FL_DEFAULT, _PTDRV_MAJOR, 0,
+- (S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
+- &pt_drv_fops, NULL );
+-# else /* DEVFS_26_STYLE */
+- devfs_mk_cdev(MKDEV(_PTDRV_MAJOR, devCount),
+- (S_IFCHR | S_IRUGO | S_IWUGO | S_IFCHR),
+- "scanner/pt_drv%d", devCount);
+-# endif
+-#else
+-# ifdef LINUX_26
+- sprintf(devname, "pt_drv%d", devCount);
+- CLASS_DEV_CREATE(ptdrv_class,
+- MKDEV(_PTDRV_MAJOR, devCount), NULL,
+- devname);
+-
+-# endif /* LINUX_26 */
+-#endif /* CONFIG_DEVFS_FS */
+- ProcFsRegisterDevice( PtDrvDevices[i] );
+- devCount++;
+- } else {
+- retval = result;
+- ptdrvShutdown( PtDrvDevices[i] );
+- PtDrvDevices[i] = NULL;
+- }
+- }
+- }
+-
+- /* * if something went wrong, shutdown all... */
+- if( devCount == 0 ) {
+-
+-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
+-out_devfs:
+- class_destroy(ptdrv_class);
+-#endif
+-
+-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
+- devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
+-#else
+- unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
+-#endif
+- ProcFsShutdown();
+-
+-#ifdef __KERNEL__
+- _PRINT( KERN_INFO "pt_drv : no device(s) detected, (%i)\n", retval );
+-#endif
+-
+- } else {
+-
+- DBG( DBG_HIGH, "pt_drv : init done, %u device(s) found\n", devCount );
+- retval = _OK;
+- }
+- DBG( DBG_HIGH, "---------------------------------------------\n" );
+-
+- deviceScanning = _FALSE;
+- return retval;
+-}
+-
+-/*.............................................................................
+- * cleanup the show
+- */
+-#ifdef LINUX_26
+-static void __exit ptdrv_exit( void )
+-#else
+-void cleanup_module( void )
+-#endif
+-{
+- UInt i;
+- pScanData ps;
+-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
+- char controlname[24];
+- devfs_handle_t master;
+-#endif
+-
+- DBG( DBG_HIGH, "pt_drv: cleanup_module()\n" );
+-
+- for ( i = 0; i < _MAX_PTDEVS; i++ ) {
+-
+- ps = PtDrvDevices[i];
+- PtDrvDevices[i] = NULL;
+-
+- if ( NULL != ps ) {
+-#ifdef CONFIG_DEVFS_FS
+-# ifndef DEVFS_26_STYLE
+- sprintf( controlname, "scanner/pt_drv%d", i );
+- master = devfs_find_handle( NULL,controlname, 0, 0,
+- DEVFS_SPECIAL_CHR, 0 );
+- devfs_unregister( master );
+-# else
+- devfs_remove("scanner/pt_drv%d", i);
+-# endif
+-#else
+-# ifdef LINUX_26
+- CLASS_DEV_DESTROY(ptdrv_class, MKDEV(_PTDRV_MAJOR, i));
+-# endif /* LINUX_26 */
+-#endif /* CONFIG_DEVFS_FS */
+- ptdrvShutdown( ps );
+- ProcFsUnregisterDevice( ps );
+- }
+- }
+-
+-#if (defined(CONFIG_DEVFS_FS) && !defined(DEVFS_26_STYLE))
+- devfs_unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
+-#else
+- unregister_chrdev( _PTDRV_MAJOR, _DRV_NAME );
+-#endif
+- ProcFsShutdown();
+-
+-#if !defined (CONFIG_DEVFS_FS) && defined (LINUX_26)
+- class_destroy(ptdrv_class);
+-#endif
+-
+- DBG( DBG_HIGH, "pt_drv: cleanup done.\n" );
+- DBG( DBG_HIGH, "*********************************************\n" );
+-}
+-
+-#ifdef LINUX_26
+-module_init(ptdrv_init);
+-module_exit(ptdrv_exit);
+-#endif
+-
+-#endif /*MODULE*/
+-
+-
+-/*.............................................................................
+- * device open...
+- */
+-static int pt_drv_open(struct inode *inode, struct file *file)
+-{
+- pScanData ps;
+-
+- DBG( DBG_HIGH, "pt_drv_open()\n" );
+-
+- ps = get_pt_from_inode(inode);
+-
+- if ( NULL == ps ) {
+- return(-ENXIO);
+- }
+-
+- /* device not found ? */
+- if (!(ps->flags & _PTDRV_INITALIZED)) {
+- return(-ENXIO);
+- }
+-
+- /* device is busy ? */
+- if (ps->flags & _PTDRV_OPEN) {
+- return(-EBUSY);
+- }
+-
+-#ifdef LINUX_26
+- if (!try_module_get(THIS_MODULE))
+- return -EAGAIN;
+-#else
+- MOD_INC_USE_COUNT;
+-#endif
+- ps->flags |= _PTDRV_OPEN;
+-
+- return _OK;
+-}
+-
+-/*.............................................................................
+- * device close...
+- */
+-static CLOSETYPE pt_drv_close(struct inode * inode, struct file * file)
+-{
+- pScanData ps;
+-
+- DBG( DBG_HIGH, "pt_drv_close()\n" );
+-
+- if ((ps = get_pt_from_inode(inode)) ) {
+-
+- ptdrvClose( ps );
+-
+- ps->flags &= ~_PTDRV_OPEN;
+-#ifdef LINUX_26
+- module_put(THIS_MODULE);
+-#else
+- MOD_DEC_USE_COUNT;
+-#endif
+- CLOSERETURN(0);
+- } else {
+-
+- DBG( DBG_HIGH, "pt_drv: - close failed!\n" );
+- CLOSERETURN(-ENXIO);
+- }
+-}
+-
+-/*.............................................................................
+- * read data from device
+- */
+-#ifdef LINUX_20
+-static int pt_drv_read(struct inode *inode, struct file *file,
+- char *buffer, int count)
+-{
+- int result;
+- pScanData ps;
+-
+- if ( !(ps = get_pt_from_inode(inode)))
+- return(-ENXIO);
+-#else
+-static ssize_t pt_drv_read( struct file *file,
+- char *buffer, size_t count, loff_t *tmp )
+-{
+- int result;
+- pScanData ps;
+-
+- if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
+- return(-ENXIO);
+-#endif
+- if ((result = verify_area_20(VERIFY_WRITE, buffer, count)))
+- return result;
+-
+- /*
+- * as the driver contains some global vars, it is not
+- * possible to scan simultaenously with two or more devices
+- */
+- if( _TRUE == deviceScanning ) {
+- printk( KERN_INFO "pt_drv: device %u busy!!!\n", ps->devno );
+- return(-EBUSY);
+- }
+-
+- deviceScanning = _TRUE;
+-
+- result = ptdrvRead( ps, buffer, count );
+-
+- deviceScanning = _FALSE;
+- return result;
+-}
+-
+-/*.............................................................................
+- * writing makes no sense
+- */
+-#ifdef LINUX_20
+-static int pt_drv_write(struct inode * inode, struct file * file,
+- const char * buffer, int count)
+-{
+- return -EPERM;
+-}
+-#else
+- static ssize_t pt_drv_write( struct file * file,const char * buffer,
+- size_t tmp,loff_t* count)
+-{
+- return -EPERM;
+-}
+-#endif
+-
+-/*.............................................................................
+- * the ioctl interface
+- */
+-#ifdef NOLOCK_IOCTL
+-static long pt_drv_ioctl( struct file *file, UInt cmd, unsigned long arg )
+-{
+- pScanData ps;
+-
+- if ( !(ps = get_pt_from_inode(file->f_dentry->d_inode)) )
+- return(-ENXIO);
+-
+- return ptdrvIoctl( ps, cmd, (pVoid)arg);
+-}
+-#else
+-static int pt_drv_ioctl( struct inode *inode, struct file *file,
+- UInt cmd, unsigned long arg )
+-{
+- pScanData ps;
+-
+- if ( !(ps = get_pt_from_inode(inode)) )
+- return(-ENXIO);
+-
+- return ptdrvIoctl( ps, cmd, (pVoid)arg);
+-}
+-#endif
+-
+-#else /* the user-mode interface */
+-
+ /*.............................................................................
+ * here we only have wrapper functions
+ */
+@@ -1980,6 +1279,4 @@ static int PtDrvRead ( pUChar buffer, in
+ return ptdrvRead( PtDrvDevices[0], buffer, count );
+ }
+
+-#endif /* guard __KERNEL__ */
+-
+ /* END PLUSTEK-PP_PTDRV.C ...................................................*/
+Index: trunk/backend/plustek-pp_scan.h
+===================================================================
+--- trunk.orig/backend/plustek-pp_scan.h
++++ trunk/backend/plustek-pp_scan.h
+@@ -63,8 +63,6 @@
+ #ifndef __PLUSTEK_SCAN_H__
+ #define __PLUSTEK_SCAN_H__
+
+-#ifndef __KERNEL__
+-
+ # include <stdlib.h>
+ # include <stdarg.h>
+ # include <string.h>
+@@ -76,19 +74,6 @@
+ # ifdef HAVE_SYS_IO_H
+ # include <sys/io.h>
+ # endif
+-#else
+-# include <linux/kernel.h>
+-# include <linux/init.h>
+-# include <linux/version.h>
+-# include "plustek-pp_sysdep.h"
+-# include <linux/delay.h>
+-# include <linux/parport.h>
+-
+-#ifdef LINUX_24
+-# include <linux/parport_pc.h>
+-#endif /* LINUX_24 */
+-
+-#endif /* __KERNEL__ */
+
+ /*.............................................................................
+ * driver properties
+@@ -104,20 +89,6 @@
+ # define _OPF ps->IO.fnOut
+ # define _IPF ps->IO.fnIn
+
+-#ifdef __KERNEL__
+-
+-#define _OUTB_CTRL(pSD,port_value) _OPF(port_value,pSD->IO.pbControlPort)
+-#define _OUTB_DATA(pSD,port_value) _OPF(port_value,pSD->IO.pbSppDataPort)
+-#define _OUTB_ECTL(pSD,port_value) _OPF(port_value,(pSD->IO.portBase+0x402))
+-
+-#define _INB_CTRL(pSD) _IPF(pSD->IO.pbControlPort)
+-#define _INB_DATA(pSD) _IPF(pSD->IO.pbSppDataPort)
+-#define _INB_EPPDATA(pSD) _IPF(pSD->IO.pbEppDataPort)
+-#define _INB_STATUS(pSD) _IPF(pSD->IO.pbStatusPort)
+-#define _INB_ECTL(pSD) _IPF((pSD->IO.portBase+0x402))
+-
+-#else
+-
+ #define _OUTB_CTRL(pSD,port_value) sanei_pp_outb_ctrl(pSD->pardev, port_value)
+ #define _OUTB_DATA(pSD,port_value) sanei_pp_outb_data(pSD->pardev, port_value)
+ #define _OUTB_ECTL(pSD,port_value)
+@@ -127,32 +98,19 @@
+ #define _INB_EPPDATA(pSD) sanei_pp_inb_epp(pSD->pardev)
+ #define _INB_STATUS(pSD) sanei_pp_inb_stat(pSD->pardev)
+
+-#endif
+-
+ /*.............................................................................
+ * for memory allocation
+ */
+-#ifndef __KERNEL__
+ # define _KALLOC(x,y) malloc(x)
+ # define _KFREE(x) free(x)
+ # define _VMALLOC(x) malloc(x)
+ # define _VFREE(x) free(x)
+-#else
+-# define _KALLOC(x,y) kmalloc(x,y)
+-# define _KFREE(x) kfree(x)
+-# define _VMALLOC(x) vmalloc(x)
+-# define _VFREE(x) vfree(x)
+-#endif
+
+ /*
+ * WARNING - never use the _SECOND define with the _DODELAY macro !!
+ * they are for use the MiscStartTimer function and the _DO_UDELAY macro
+ */
+-#ifndef __KERNEL__
+ typedef double TimerDef, *pTimerDef;
+-#else
+-typedef long long TimerDef, *pTimerDef;
+-#endif
+
+ #define _MSECOND 1000 /* based on 1 us */
+ #define _SECOND (1000*_MSECOND)
+@@ -160,13 +118,8 @@ typedef long long TimerDef, *pTimerDef;
+ /*.............................................................................
+ * timer topics
+ */
+-#ifndef __KERNEL__
+ # define _DO_UDELAY(usecs) sanei_pp_udelay(usecs)
+ # define _DODELAY(msecs) { int i; for( i = msecs; i--; ) _DO_UDELAY(1000); }
+-#else
+-# define _DO_UDELAY(usecs) udelay(usecs)
+-# define _DODELAY(msecs) mdelay(msecs)
+-#endif
+
+ /*.............................................................................
+ * include the shared stuff right here, this concerns the ioctl interface
+Index: trunk/backend/plustek-pp_scandata.h
+===================================================================
+--- trunk.orig/backend/plustek-pp_scandata.h
++++ trunk/backend/plustek-pp_scandata.h
+@@ -143,17 +143,7 @@ typedef struct {
+ */
+ typedef struct scandata
+ {
+-#ifdef __KERNEL__
+- UInt flags; /* as follows: */
+-#define _PTDRV_INITALIZED 0x00000001
+-#define _PTDRV_OPEN 0x00000002
+-
+- struct pardevice *pardev; /* for accessing parport... */
+- struct parport *pp;
+- ProcDirDef procDir;
+-#else
+ int pardev; /* parport handle in user-space */
+-#endif
+
+ /*
+ * device control
+Index: trunk/doc/Makefile.am
+===================================================================
+--- trunk.orig/doc/Makefile.am
++++ trunk/doc/Makefile.am
+@@ -124,8 +124,8 @@ BEDOCS += mustek/mustek.CHANGES
+ BEDOCS += mustek_usb/mustek_usb.CHANGES mustek_usb/mustek_usb.TODO
+ BEDOCS += mustek_usb2/mustek_usb2.CHANGES mustek_usb2/mustek_usb2.TODO
+ BEDOCS += niash/niash.TODO
+-BEDOCS += plustek/FAQ plustek/MakeModule.sh plustek/Makefile.kernel24 \
+- plustek/Makefile.kernel26 plustek/Plustek-PARPORT-TODO.txt \
++BEDOCS += plustek/FAQ \
++ plustek/Plustek-PARPORT-TODO.txt \
+ plustek/Plustek-PARPORT.changes plustek/Plustek-PARPORT.txt \
+ plustek/Plustek-USB-TODO.txt plustek/Plustek-USB.changes \
+ plustek/Plustek-USB.txt
+Index: trunk/doc/plustek/FAQ
+===================================================================
+--- trunk.orig/doc/plustek/FAQ
++++ trunk/doc/plustek/FAQ
+@@ -12,111 +12,10 @@ If you have some more FAQ entries, let m
+ THANKS to Jochen <jochen@puchalla-online.de>, who roamed through the
+ mailing-list and gathered the different questions.
+
+-
+ *******************************************************************************
+-* TROUBLE-SHOOTING *
+-* *
+-* DRIVER TOPICS *
++* General *
+ *******************************************************************************
+
+-
+-SYMPTOM: "kernel-module version mismatch"
+---------
+-"When I try to "make load" I get an error"
+-
+-/sbin/modprobe pt_drv || exit 1
+-/lib/modules/2.2.14-6.0.6/misc/pt_drv.o: kernel-module version mismatch
+-/lib/modules/2.2.14-6.0.1/misc/pt_drv.o was compiled
+-for kernel version 2.2.14-5.0
+-while this kernel is version 2.2.14-6.0.1.
+-
+-PROBLEM:
+---------
+-You're using the wrong Kernel-header files.
+-
+-The path
+-/usr/include/linux is a link to
+-/usr/src/linux/include/linux and
+-/usr/src/linux is normally a link to your current
+-kernel, i.e:
+-/usr/src/linux-2.2.14
+-
+-If you now upgrade your kernel and you have
+-forgotten to correct the link /usr/src/linux, then
+-every kernel-module you build outside the
+-kernelsource structure will include the wrong
+-version information.
+-
+-SOLUTION:
+----------
+-Set the link /usr/src/linux
+-to your current kernel-source tree before recompiling
+-kernel-modules like pt_drv, then your version mismatch
+-problem should be solved.
+-
+-
+-
+-SYMPTOM: "Device or resource busy"
+---------
+-Any attempt to "modprobe" or "make load" the driver leads
+-to this message.
+-
+-PROBLEM:
+---------
+-The driver refuses to load. During startup, the driver performs
+-some tests according to the parallel port and the connected
+-scanners.
+-If the parallel port is not supported or the scanner cannot be
+-found, the driver returns an error and the system will report
+-"device or resource busy"
+-
+-SOLUTION:
+----------
+-There's no way to provide a general solution. First of all
+-you should check your connections and the parallel port.
+-Also check power for your scanner.
+-If the problem still exists, enable the debug-messages of the
+-pt_drv module (see INSTALL).
+-Then check the messages after loading or send the output to
+-the mailing list.
+-Most of these problems are related to HW-problems. Before
+-giving up, check the scanner under Windows (not really a
+-good advice I know, but it helps to find HW-damage).
+-There was also one case were the internal plugs of the parport
+-connection were wrong...
+-
+-
+-
+-SYMPTOM: "Unresolved symbols"
+---------
+-"make load" or "modprobe pt_drv" produces this message:
+-
+-/sbin/modprobe pt_drv || exit 1
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_unregister_device
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_enumerate
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_register_device
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_claim
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: unresolved symbol parport_release
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o: insmod
+-/lib/modules/2.2.14-5.0/misc/pt_drv.o failed
+-
+-
+-PROBLEM:
+---------
+-The driver needs at least the parport_pc and the parport modules
+-to work. They MUST be loaded prior to pt_drv. If these modules
+-are not loaded you get this message.
+-
+-SOLUTION:
+----------
+-Simply load the parport module. You can add this dependency to
+-your /etc/modules.conf (or /etc/conf.modules) file (see INSTALL).
+-Then every time you load pt_drv with modprobe, parport will be loaded
+-automatically. After modifying this file, call
+-depmod -va
+-
+-
+-
+ SYMPTOM: Scanner makes awful noise
+ --------
+
+@@ -138,7 +37,6 @@ The second case is often reported when t
+ already loaded. So remove lp.o before loading pt_drv.
+
+
+-
+ SYMPTOM: Printer starts to print while scanning
+ --------
+
+@@ -294,23 +192,6 @@ A: You should be able to use xscanimage
+ now the Acquire Image menu entry. That's all.
+ If not, start gimp from an xterm and have a look at the output.
+
+-
+-Q: Is there any way to load the plustek_driver at bootup-time?
+-
+-A: Normally, there is no need to do so, because once you
+- altered your /etc/conf.modules file (or /etc/modules.conf)
+- and added the suggested stuff (see INSTALL file), you won't
+- have to worry about loading the driver. It happens automagically. ;-)
+- The driver will be loaded when needed (and eventually
+- removed after a specific time of not using it).
+-
+- Nevertheless, another possibility is to do a modprobe pt_drv in the
+- /etc/rc.d/boot.local (using SuSE) or
+- /etc/rc.d/rc.local (using RedHat or Mandrake) file
+- So the driver will be loaded at bootup-time...
+- !!! YOUR SCANNER MUST BE ONLINE during power-up then !!!
+-
+-
+ Q: I wonder if Mandrake 7.1's sane rpm file has this support already built in.
+ My scanner light is coming on yet Xscanimage seems to report that there
+ is no scanner present.
+Index: trunk/doc/plustek/MakeModule.sh
+===================================================================
+--- trunk.orig/doc/plustek/MakeModule.sh
++++ /dev/null
+@@ -1,116 +0,0 @@
+-#!/bin/bash
+-#******************************************************************************
+-#
+-# Bash-Script to create Plustek-Scannerdriver modules for Kernel 2.4, 2.6 and 3.x
+-# out of the backend sources...
+-#
+-
+-BUILD_DIR=$PWD/build
+-SRC_DIR=$PWD/../../backend
+-MAKEFILE=$PWD/Makefile.kernel26
+-KERNEL_V=`uname -r`
+-OSMINOR=`uname -r | cut -b 3`
+-OSMAJOR=`uname -r | cut -b 1`
+-
+-#
+-# some intro ;-)
+-#
+-echo "This script will try and build a suitable kernel-module for your system."
+-echo "If you'd like to make the module WITH debug output, restart this script"
+-echo "with as follows:"
+-echo "./MakeModule.sh DEBUG=y"
+-echo "Press <ENTER> to continue or <CTRL><C> to cancel."
+-read
+-
+-#
+-# we need to be root user...
+-#
+-echo -n "Check for root..."
+-if [ $EUID -ne 0 ]; then
+- echo -e "\b\b\b - failed"
+- echo "Please retry as root user."
+- exit -1
+-fi
+-echo -e "\b\b\b - done."
+-
+-#
+-# Version checks...
+-#
+-echo -e "\nCheck for kernelversion:"
+-if [ "$OSMAJOR" == "3" ];then
+- echo "Using makefile for kernel 2.6.x - okay for kernel 3 as well..."
+- MAKEFILE=$PWD/Makefile.kernel26
+-elif [ "$OSMINOR" == "6" ]; then
+- echo "Using makefile for kernel 2.6.x"
+- MAKEFILE=$PWD/Makefile.kernel26
+-elif [ "$OSMINOR" == "4" ]; then
+- echo "Using makefile for kernel 2.4.x"
+- MAKEFILE=$PWD/Makefile.kernel24
+-else
+- echo "Your kernelversion >"$OSMAJOR"."$OSMINOR"< is probably not supported"
+- exit -2
+-fi
+-
+-#
+-# Setup...
+-#
+-echo -e "Build-directory: \n"$BUILD_DIR
+-echo -n "Removing build-directory..."
+-rm -rf $BUILD_DIR
+-echo -e "\b\b\b - done."
+-
+-echo -n "Creating build-directory..."
+-mkdir $BUILD_DIR
+-cd $BUILD_DIR
+-echo -e "\b\b\b - done.\n"
+-
+-echo -n "Linking source files..."
+-C_FILES=`ls $SRC_DIR/plustek-pp_*.c`
+-H_FILES=`ls $SRC_DIR/plustek-pp_*.h`
+-
+-for F in $C_FILES $H_FILES $SRC_DIR/plustek-pp.h $SRC_DIR/plustek_pp.c; do
+- ln -s $F .
+-done
+-echo -e "\b\b\b - done."
+-
+-echo -n "Copying Makefile to build-directory..."
+-cp $MAKEFILE Makefile
+-echo -e "\b\b\b - done."
+-
+-#
+-# Building the module...
+-#
+-echo "Making the module..."
+-if [ "$OSMAJOR" == "2" -a "$OSMINOR" == "4" ]; then
+- make all $1
+-else
+- make -C /lib/modules/$KERNEL_V/build/ SUBDIRS=$BUILD_DIR modules $1
+-fi
+-RES=$?
+-cd ..
+-if [ $RES != 0 ]; then
+- echo "There were some build errors..."
+- exit -1
+-fi
+-echo "done."
+-
+-echo "Should I install the module?"
+-echo "Press <ENTER> to continue or <CTRL><C> to cancel."
+-read
+-
+-make -C $BUILD_DIR install
+-
+-echo "Should I try and load the module?"
+-echo "If this step fails, check the kernel-log."
+-echo "Press <ENTER> to continue or <CTRL><C> to cancel."
+-read
+-
+-make -C $BUILD_DIR load
+-echo "done."
+-
+-echo "Should I remove the build directory?"
+-echo "Press <ENTER> to continue or <CTRL><C> to cancel."
+-read
+-
+-rm -rf $BUILD_DIR
+-echo "done."
+Index: trunk/doc/plustek/Makefile.kernel24
+===================================================================
+--- trunk.orig/doc/plustek/Makefile.kernel24
++++ /dev/null
+@@ -1,250 +0,0 @@
+-# Makefile for the plustek scanner driver (kernel-module)
+-#
+-###############################################################################
+-#
+-# define the directories
+-#
+-HOME_DIR := .
+-SRC_DIR := $(HOME_DIR)
+-INC_DIR := $(SRC_DIR)
+-OBJ_DIR := $(HOME_DIR)/obj
+-DOC_DIR := $(HOME_DIR)/doc
+-BACKEND := $(SRC_DIR)
+-
+-#
+-# define the used tools
+-#
+-MD = mkdir -p
+-CC = gcc
+-TAR = tar
+-REF = cxref
+-
+-#
+-# Comment/uncomment the following line to disable/enable debugging
+-# can also be set by commandline parameter: make all DEBUG=y
+-#
+-#DEBUG = y
+-
+-#
+-# common compiler options
+-#
+-OPT = -fomit-frame-pointer -D_PTDRV_VERSTR=\"$(VERSIONSTR)\"
+-
+-#
+-# cxref options
+-#
+-REFOPT = -xref-all -index-all -html32
+-
+-#
+-# Comment out if you are not running SMP. Someone take this out of here
+-# when the SMP stuff gets moved out of the kernel Makefile.
+-# SMP = 1
+-# SMP_PROF = 1
+-
+-#
+-# add the following to get assembly listing
+-# -Wa,-alh,-L -g
+-
+-#
+-# get some version numbers
+-#
+-ifeq ($(LINUXVERSION),)
+- LINUXVERSION = $(shell uname -r)
+-endif
+-
+-VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(SRC_DIR)/plustek_pp.c | cut -b25-50 )
+-
+-# Change it here or specify it on the "make" commandline
+-ifeq ($(HEADER_PATH),)
+-MACHTYPE = $(shell env | grep debian-linux | wc -l | sed 's/ //g')
+-ifeq ($(MACHTYPE),1)
+-# debian
+- HEADER_PATH = /usr/src/kernel-headers-$(LINUXVERSION)/include
+-else
+-# redhat, slackware
+- HEADER_PATH = /usr/src/linux/include
+-endif
+-# HEADER_PATH = /usr/include
+-endif
+-
+-ifeq ($(DEBUG),y)
+- DEBFLAGS = -O -g -DDEBUG # "-O" is needed to expand inlines
+-else
+- DEBFLAGS = -O2
+-endif
+-
+-#
+-# the new style reference
+-#
+-K24_HEADER_PATH = /lib/modules/$(LINUXVERSION)/build/include
+-
+-#
+-# try to autodetect if we can use the new style header include references
+-#
+-KERNEL_HEADERS = $(shell if test -d $(K24_HEADER_PATH); then \
+- echo $(K24_HEADER_PATH); \
+- else \
+- echo $(HEADER_PATH); \
+- fi; )
+-
+-#
+-# seems to be necessary for kernels 2.4.x
+-#
+-MODVERFILE = $(shell if [ -e $(KERNEL_HEADERS)/linux/modversions.h ]; then \
+- echo $(KERNEL_HEADERS)/linux/modversions.h ; \
+- else \
+- echo $(KERNEL_HEADERS)/linux/modsetver.h ; \
+- fi )
+-
+-MODFLAGS = -DMODULE
+-
+-#
+-# set MODVERSIONS if the kernel uses it
+-#
+-VERSUSED = $(shell grep 'define CONFIG_MODVERSIONS' \
+- $(KERNEL_HEADERS)/linux/autoconf.h | wc -l | sed 's/ //g')
+-ifeq ($(VERSUSED),1)
+- MODFLAGS += -DMODVERSIONS -include $(MODVERFILE)
+-endif
+-
+-
+-WARNFLAGS = -Wall -Wstrict-prototypes
+-CFLAGS = $(WARNFLAGS) $(OPT) -D__KERNEL__ -I$(KERNEL_HEADERS) -I$(INC_DIR) -I$(BACKEND) $(DEBFLAGS) $(MODFLAGS)
+-MODLIB = /lib/modules/$(LINUXVERSION)
+-
+-ifdef SMP
+-CFLAGS += -D__SMP__
+-
+-ifdef SMP_PROF
+-CFLAGS += -D__SMP_PROF__
+-endif
+-endif
+-
+-TARGET = pt_drv
+-
+-OBJ = $(TARGET).o
+-NAMES := dac detect genericio image map misc models io procfs
+-NAMES := $(NAMES) motor p9636 ptdrv scale tpa p48xx p12 p12ccd
+-NAMES := $(addprefix plustek-pp_, $(NAMES))
+-SRCS := $(addprefix $(SRC_DIR)/, $(NAMES))
+-SRCS := $(addsuffix .c, $(SRCS))
+-OBJS := $(addprefix $(OBJ_DIR)/, $(NAMES))
+-OBJS := $(addsuffix .o, $(OBJS))
+-INCS := scan dbg types scandata procs hwdefs sysdep
+-INCS := $(addsuffix .h, $(INCS))
+-HDRS = $(addprefix $(INC_DIR)/plustek-pp_, $(INCS))
+-
+-#
+-# the header files we need from the backend
+-#
+-BACKINCS := plustek-pp.h
+-BACKINCS := $(addprefix $(BACKEND)/, $(BACKINCS))
+-
+-group = "root"
+-mode = "644"
+-INST_DIR = /lib/modules/$(LINUXVERSION)/kernel/drivers/char
+-
+-info:
+- @clear
+- @echo "Makefile to create the Plustek-Scanner kernel-module:"
+- @echo "all ... builds the module"
+- @echo "all DEBUG=y ... builds the module with debug-messages enabled"
+- @echo "clean ... cleans up the show"
+- @echo "install ... installs the module to the library path"
+- @echo "uninstall ... removes the module from the library path"
+- @echo "load ... tries to load the module and creates device nodes"
+- @echo "unload ... unloads the module"
+-
+-
+-all: .depend chkdir $(OBJ)
+-
+-#
+-# create object directory
+-#
+-.PHONY : chkdir
+-chkdir:
+- @-$(MD) $(OBJ_DIR)
+- @-$(MD) $(DOC_DIR)
+-
+-$(OBJ): $(OBJS)
+- $(LD) -r $^ -o $@
+-
+-$(OBJS): Makefile $(HDRS) $(BACKINCS)
+-
+-$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c
+- $(CC) $(CFLAGS) -c $< -o $@
+-
+-$(OBJ_DIR)/$(OBJ): VERSION1 VERSION0
+-
+-#
+-# copy the driver to the modules directory
+-#
+-install:
+- mkdir -p $(INST_DIR)
+- install -c -m $(mode) $(OBJ) $(INST_DIR)
+- /sbin/depmod -a
+-
+-#
+-# remove it
+-#
+-uninstall:
+- rm -f $(INST_DIR)/$(OBJ)
+-
+-#
+-# use modprobe to load the driver, remember to set the
+-# parameter in /etc/modules.conf (see sane-plustek_pp.man for more details)
+-#
+-load: $(INST_DIR)/$(OBJ)
+-# invoke modprobe with all arguments we got
+- /sbin/modprobe $(TARGET) || exit 1
+-
+-# Remove stale nodes and replace them, then give gid and perms
+- rm -f /dev/$(TARGET)*
+-
+-# when using the devfs support, we check the /dev/scanner entries
+-# and only create links to the devfs nodes
+-# at least we create one link
+- @if [ -e /dev/scanner/$(TARGET)* ]; then \
+- ln -s /dev/scanner/$(TARGET)0 /dev/$(TARGET); \
+- for name in `ls /dev/scanner | grep $(TARGET)`; do \
+- ln -s /dev/scanner/$$name /dev/$$name ; \
+- done \
+- else \
+- mknod /dev/$(TARGET) c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
+- mknod /dev/$(TARGET)0 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
+- mknod /dev/$(TARGET)1 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 1; \
+- mknod /dev/$(TARGET)2 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 2; \
+- mknod /dev/$(TARGET)3 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 3; \
+- \
+- chgrp $(group) /dev/$(TARGET)*; \
+- chmod $(mode) /dev/$(TARGET)*; \
+- fi
+-
+-#
+-# unload the driver
+-#
+-unload:
+- /sbin/modprobe -r $(TARGET) || exit 1
+-
+-# Remove stale nodes
+- rm -f /dev/$(TARGET)*
+-
+-#
+-# create reference docu
+-#
+-doc: chkdir
+- $(REF) $(REFOPT) $(INC_DIR)/*.h $(SRC_DIR)/*.c $(BACKEND)/plustek-share.h \
+- -D__KERNEL__ -I$(KERNEL_HEADERS) -I$(INC_DIR) -I$(BACKEND) $(MODFLAGS) \
+- -D_PTDRV_V1=$(VERSION1) -D_PTDRV_V0=$(VERSION0) -D_PTDRV_BUILD=$(BUILD) -O$(DOC_DIR)
+-
+-clean:
+- @-rm -f $(OBJ_DIR)/*.o .depend depend dep $(REF).* *.html $(TARGET).o
+- @-rm -rf $(OBJ_DIR)
+- @-rm -rf $(DOC_DIR)
+-
+-depend .depend dep:
+- $(CC) $(CFLAGS) -M $(SRCS) > $@
+-
+-ifeq (.depend,$(wildcard .depend))
+-#include .depend
+-endif
+Index: trunk/doc/plustek/Makefile.kernel26
+===================================================================
+--- trunk.orig/doc/plustek/Makefile.kernel26
++++ /dev/null
+@@ -1,124 +0,0 @@
+-# Makefile for the plustek scanner driver (kernel-module)
+-#
+-###############################################################################
+-
+-#
+-# retrieve the version numbers
+-#
+-ifeq ($(LINUXVERSION),)
+- LINUXVERSION = $(shell uname -r)
+-endif
+-LINUXRELEASE = $(shell uname -r | cut -d'.' -f3)
+-
+-ifeq ($(VERSIONSTR),)
+- ifeq ($(SUBDIRS),)
+- VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(M)/plustek_pp.c | cut -b25-50 )
+- else
+- VERSIONSTR = $(shell grep "define BACKEND_VERSION" $(SUBDIRS)/plustek_pp.c | cut -b25-50 )
+- endif
+-endif
+-
+-#
+-# extra flags
+-#
+-EXTRA_CFLAGS += -D_PTDRV_VERSTR=\"$(VERSIONSTR)\"
+-
+-ifeq ($(DEBUG),y)
+- EXTRA_CFLAGS += -DDEBUG
+-endif
+-
+-#
+-# the module name
+-#
+-TARGET := pt_drv
+-MODULE := $(TARGET).ko
+-
+-#
+-# our files...
+-#
+-NAMES := dac detect genericio image map misc models io procfs
+-NAMES := $(NAMES) motor p9636 ptdrv scale tpa p48xx p12 p12ccd
+-NAMES := $(addprefix plustek-pp_, $(NAMES))
+-OBJS := $(addsuffix .o, $(NAMES))
+-
+-#
+-# now the kernel magic
+-#
+-ifneq ($(KERNELRELEASE),)
+-obj-m := $(TARGET).o
+-
+-$(TARGET)-objs := $(OBJS)
+-
+-else
+-KDIR := /lib/modules/$(shell uname -r)/build
+-PWD := $(shell pwd)
+-
+-default:
+- $(MAKE) -C $(KDIR) M=$(PWD) modules
+-endif
+-
+-#
+-# the installation stuff
+-#
+-group = "root"
+-mode = "644"
+-INST_DIR = /lib/modules/$(LINUXVERSION)/kernel/drivers/parport
+-
+-#
+-# copy the driver to the modules directory
+-#
+-install:
+- mkdir -p $(INST_DIR)
+- install -c -m $(mode) $(MODULE) $(INST_DIR)
+- /sbin/depmod -a
+-
+-#
+-#
+-#
+-uninstall:
+- rm -f $(INST_DIR)/$(MODULE)
+-
+-#
+-# use modprobe to load the driver, remember to set the
+-# parameter in /etc/conf.modules (see INSTALL for more details)
+-#
+-load: $(INST_DIR)/$(MODULE)
+-# invoke modprobe with all arguments we got
+- /sbin/modprobe $(TARGET) || exit 1
+-
+-# Remove stale nodes and replace them, then give gid and perms
+- rm -f /dev/$(TARGET)*
+-
+-# when using the devfs support, we check the /dev/scanner entries
+-# and only create links to the devfs nodes
+-# at least we create one link
+- @if [ -e /dev/scanner/$(TARGET)* ]; then \
+- ln -s /dev/scanner/$(TARGET)0 /dev/$(TARGET); \
+- for name in `ls /dev/scanner | grep $(TARGET)`; do \
+- ln -s /dev/scanner/$$name /dev/$$name ; \
+- done \
+- else \
+- mknod /dev/$(TARGET) c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
+- mknod /dev/$(TARGET)0 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 0; \
+- mknod /dev/$(TARGET)1 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 1; \
+- mknod /dev/$(TARGET)2 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 2; \
+- mknod /dev/$(TARGET)3 c `cat /proc/devices | sed -ne "s/\([0-9]*\) pt_drv/\1/p"` 3; \
+- \
+- chgrp $(group) /dev/$(TARGET)*; \
+- chmod $(mode) /dev/$(TARGET)*; \
+- fi
+-
+-#
+-# unload the driver
+-#
+-unload:
+- /sbin/modprobe -r $(TARGET) || exit 1
+-
+-# Remove stale nodes
+- rm -f /dev/$(TARGET)*
+-
+-#
+-# cleanup the show
+-#
+-clean:
+- @-rm -f *.o .depend depend dep $(MODULE) $(TARGET).o $(TARGET).mod.c .*.cmd
+Index: trunk/doc/plustek/Plustek-PARPORT.txt
+===================================================================
+--- trunk.orig/doc/plustek/Plustek-PARPORT.txt
++++ trunk/doc/plustek/Plustek-PARPORT.txt
+@@ -1,46 +1,10 @@
+ Plustek-PARPRORT.txt (2004-03-28) Gerhard Jäger <gerhard@gjaeger.de>
+ ====================================================================
+
+-
+ Beginning with SANE-1.0.13, there's a backend called plustek_pp.
+ This is for controlling Plustek parallel-port scanner and compatible
+ devices. For a full listing, see plustek_pp.desc.
+
+-This code formerly was available for creating the Linux kernelmodule
+-pt_drv. This should no longer be necessary. You should be able to use
++This code formerly was available for creating the Linux kernel module
++pt_drv. This is no longer be necessary. You should be able to use
+ the backend out of the box.
+-
+-
+-The kernel module
+------------------
+-
+-As it might be helpful to create and use the kernel-module, this way still
+-exists. It's possible to create this module out of the backend sources
+-in sane-backends/backend. Simply do (as root user)
+-
+-./MakeModule.sh
+-
+-Then the module should be compiled, installed and loaded.
+-
+-Add the following three lines to file /etc/modules.conf
+-
+-alias char-major-40 pt_drv
+-pre-install pt_drv modprobe -k parport
+-options pt_drv lampoff=180 warmup=15 port=0x378 lOffonEnd=0 mov=0 slowIO=1
+-
+-See man page for sane-plustek_pp ("man sane-plustek_pp") for explanation of
+-these options.
+-
+-Now "scanimage -L" should show something like this:
+-device `plustek:/dev/pt_drv' is a Plustek 9630P flatbed scanner
+-
+-
+-Known Problems:
+----------------
+-
+-Sometimes it is necessary to change the ioctl-interface between the
+-driver and the backend, in this case the version number of the communication
+-protocol will be changed and newer drivers won't work with older backends
+-and vice versa.
+-In this case (error -9019 in the SANE debug output!!) you have to recompile SANE
+-AND the driver (have a look at the installation procedure above).
+Index: trunk/doc/plustek/Plustek-USB.txt
+===================================================================
+--- trunk.orig/doc/plustek/Plustek-USB.txt
++++ trunk/doc/plustek/Plustek-USB.txt
+@@ -4,10 +4,7 @@ Plustek-USB.txt (2005-08-08) Gerhard Jä
+ NOTE:
+ -----
+
+-ALL YOU NEED TO RUN YOUR USB SCANNER IS ALREADY INCLUDED. THERE'S
+-NO NEED TO INSTALL THE KERNEL MODULE pt_drv. THIS ONE IS ONLY NEEDED
+-FOR THE PLUSTEK PARALLELPORT SCANNER.
+-
++ALL YOU NEED TO RUN YOUR USB SCANNER IS ALREADY INCLUDED.
+
+ List of all currently implemented devices
+ -----------------------------------------
+Index: trunk/doc/sane-plustek_pp.man
+===================================================================
+--- trunk.orig/doc/sane-plustek_pp.man
++++ trunk/doc/sane-plustek_pp.man
+@@ -9,18 +9,10 @@ The
+ library implements a SANE (Scanner Access Now Easy) backend that
+ provides access to Plustek ASIC 9600[1/3] and P9800[1/3] based
+ parallel port flatbed scanners.
+-The access of the scanner is either done directly by the backend
+-or via kernel module, called pt_drv which can be created out of
+-the
+-.B sane\-plustek_pp
+-backend code \- see also section
+-.B "BUILDING THE KERNEL MODULE"
+-for further information.
+
+ .SH "SUPPORTED DEVICES"
+
+-At present, the following scanners should work with this backend
+-and/or the kernel module:
++At present, the following scanners should work with this backend:
+ .PP
+ .B "PLUSTEK SCANNERS"
+ .PP
+@@ -112,18 +104,14 @@ BrightScan OpticPro OpticPro P12
+ .ft R
+
+ .SH "DEVICE NAMES"
+-This backend works in two modes, the so called "direct-mode"
+-and the "kernel-mode". In direct-mode, the user-space backend is
+-used, in kernel-mode, you should have a kernel-module named pt_drv
+-loaded.
+-This backends default device is:
++This backend's default device is:
+ .PP
+ .RS
+ .I 0x378
+ .RE
+ .PP
+-This "default device" will be used, if no configuration
+-file can be found. It is rather the base address of the parallel port
++This "default device" will be used if no configuration
++file can be found. It is the base address of the parallel port
+ on i386 machines.
+ .PP
+ As the backend supports up to four devices, it is possible to
+@@ -150,24 +138,13 @@ For a proper setup, you will need at lea
+ .I device 0x378
+ .RE
+ .PP
+-or
+-.RS
+-.I [kernel]
+-.br
+-.I device /dev/pt_drv
+-.RE
+-.PP
+ .I direct
+ tells the backend, that the following devicename (here
+ .IR 0x378 )
+ has to be interpreted as parallel port scanner device. In
+-fact it is the address to use, alternatively you can use
++fact it is the address to use. Alternatively you can use
+ .I /dev/parport0
+ if the backend has been compiled with libieee1284 support.
+-.I kernel
+-should only be used, when a kernel-module has been built
+-out of the backend sources. See below for more instructions
+-about this.
+ .PP
+ Further options:
+ .PP
+@@ -235,157 +212,6 @@ See the
+ file for examples.
+ .PP
+
+-.SH "BUILDING THE KERNEL MODULE"
+-As mentioned before, the
+-.B sane\-plustek_pp
+-backend code can also be compiled and installed as linux kernel module. To do so,
+-you will need the source-files of this sane\-backend installation.
+-Unpack this tar-ball and go to the directory:
+-.IR sane\-backends/doc/plustek .
+-Within this directory, you should find a script called:
+-.IR MakeModule.sh .
+-Now if your Linux kernelsources are installed correctly,
+-it should be possible to build, install and load the
+-module
+-.BR pt_drv .
+-.B Please note,
+-that the kernelsources need to be configured correctly.
+-Refer to your distributions
+-manual on how this is done. As root user, try
+-.PP
+-.I ./MakeModule.sh
+-.PP
+-the script will try and get all necessary information about your
+-running kernel and will lead you through the whole installation
+-process.
+-.br
+-.B Note: Installing and loading the can only be done as
+-superuser.
+-.PP
+-
+-.SH "KERNEL MODULE SETUP"
+-The configuration of the kernel module is done by providing
+-some or more options found below to the kernel module at
+-load time. This can be done by invoking
+-.BR insmod (8)
+-with the appropriate parameters or appending the options to the file
+-.I /etc/modules.conf (kernel < 2.6.x)
+-or
+-.I /etc/modprobe.conf (kernel >= 2.6.x)
+-.PP
+-.B
+-The Options:
+-.br
+-lampoff=lll
+-.RS
+-The value
+-.I lll
+-tells the driver, after how many seconds to
+-switch-off the lamp(s). The default value is 180.
+-0 will disable this feature.
+-.br
+-.B HINT:
+-Do not use a value that is too small, because often
+-switching on/off the lamps will reduce their lifetime.
+-.RE
+-.PP
+-port=ppp
+-.RS
+-.I ppp
+-specifies the port base address, where the scanner
+-is connected to. The default value is 0x378, which
+-is normally a standard.
+-.RE
+-.PP
+-warmup=www
+-.RS
+-.I www
+-specifies the time in seconds, how long a lamp has to be on,
+-until the driver will start to scan. The default value is 30.
+-.RE
+-.PP
+-lOffonEnd=e
+-.RS
+-.I e
+-specifies the behaviour when unloading the driver, 1 --> switch
+-lamps off, 0 --> do not change lamp status
+-.RE
+-.PP
+-slowIO=s
+-.RS
+-.I s
+-specifies which I/O functions the driver should use, 1 --> use
+-delayed functions, 0 --> use the non-delayed ones
+-.RE
+-.PP
+-forceMode=fm
+-.RS
+-.I fm
+-specifies port mode which should be used, 0 --> autodetection,
+-1 --> use SPP mode and 2 --> use EPP mode
+-.RE
+-.PP
+-mov=m
+-.RS
+-.TP
+-.IR m " = 0"
+-default: no override
+-.TP
+-.IR m " = 1"
+-OpticPro 9630PL override (works if OP9630
+-has been detected) forces legal size (14")
+-.TP
+-.IR m " = 2"
+-Primax 4800Direct override (works if OP600
+-has been detected) swaps red/green color
+-.TP
+-.IR m " = 3"
+-OpticPro 9636 override (works if OP9636 has
+-been detected) disables backends
+-transparency/negative capabilities
+-.TP
+-.IR m " = 4"
+-OpticPro 9636P override (works if OP9636 has
+-been detected) disables backends
+-transparency/negative capabilities
+-.TP
+-.IR m " = 5"
+-OpticPro A3I override (works if OP12000 has
+-been detected) enables A3 scanning
+-.TP
+-.IR m " = 6"
+-OpticPro 4800P override (works if OP600
+-has been detected) swaps red/green color
+-.TP
+-.IR m " = 7"
+-Primax 4800Direct 30bit override (works if
+-OP4830 has been detected)
+-.RE
+-.PP
+-Sample entry for file
+-.IR /etc/modules.conf :
+-.PP
+-.RS
+-alias char\-major\-40 pt_drv
+-.br
+-pre-install pt_drv modprobe -k parport
+-.br
+-options pt_drv lampoff=180 warmup=15 port=0x378 lOffonEnd=0 mov=0 slowIO=0 forceMode=0
+-.RE
+-.PP
+-For multidevice support, simply add values separated by commas to
+-the different options
+-.PP
+-.RS
+-options pt_drv port=0x378,0x278 mov=0,4 slowIO=0,1 forceMode=0,1
+-.RE
+-.PP
+-Remember to call
+-.BR depmod (8)
+-after changing
+-.IR /etc/conf.modules .
+-.PP
+-
+ .SH "PARALLEL PORT MODES"
+ .PP
+ The current driver works best, when the parallel port
+@@ -423,13 +249,6 @@ The static library implementing this bac
+ .I @LIBDIR@/libsane\-plustek_pp.so
+ The shared library implementing this backend (present on systems that
+ support dynamic loading).
+-.TP
+-.I /lib/modules/<Kernel-Version>/kernel/drivers/parport/pt_drv.o
+-The Linux kernelmodule for kernels < 2.6.x.
+-.TP
+-.I /lib/modules/<Kernel-Version>/kernel/drivers/parport/pt_drv.ko
+-The Linux kernelmodule for kernels >= 2.6.x.
+-.PP
+
+ .SH ENVIRONMENT
+ .TP
diff --git a/debian/patches/0195-genesys_fix_total_file_size_exceeding.patch b/debian/patches/0195-genesys_fix_total_file_size_exceeding.patch
new file mode 100644
index 0000000..4b95241
--- /dev/null
+++ b/debian/patches/0195-genesys_fix_total_file_size_exceeding.patch
@@ -0,0 +1,100 @@
+Description: Fix out off memory on high resultions
+Origin: upstream, https://gitlab.com/sane-project/backends/-/merge_requests/697
+Bug: https://gitlab.com/sane-project/backends/-/issues/580
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=942176
+Forwarded: no
+Last-Update: 2022-03-27
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/backend/genesys/gl124.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl124.cpp
++++ trunk/backend/genesys/gl124.cpp
+@@ -745,7 +745,7 @@ void CommandSetGl124::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+
+ DBG(DBG_info, "%s: total bytes to send to frontend = %zu\n", __func__,
+ dev->total_bytes_to_read);
+Index: trunk/backend/genesys/gl646.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl646.cpp
++++ trunk/backend/genesys/gl646.cpp
+@@ -817,7 +817,8 @@ void CommandSetGl646::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t) session.output_line_bytes_requested
++ * (size_t) session.params.lines;
+
+ /* select color filter based on settings */
+ regs->find_reg(0x04).value &= ~REG_0x04_FILTER;
+Index: trunk/backend/genesys/gl841.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl841.cpp
++++ trunk/backend/genesys/gl841.cpp
+@@ -920,7 +920,7 @@ dummy \ scanned lines
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+ if (session.use_host_side_gray) {
+ dev->total_bytes_to_read /= 3;
+ }
+Index: trunk/backend/genesys/gl842.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl842.cpp
++++ trunk/backend/genesys/gl842.cpp
+@@ -568,7 +568,7 @@ void CommandSetGl842::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+ }
+
+ ScanSession CommandSetGl842::calculate_scan_session(const Genesys_Device* dev,
+Index: trunk/backend/genesys/gl843.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl843.cpp
++++ trunk/backend/genesys/gl843.cpp
+@@ -1041,7 +1041,7 @@ void CommandSetGl843::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+
+ DBG(DBG_info, "%s: total bytes to send = %zu\n", __func__, dev->total_bytes_to_read);
+ }
+Index: trunk/backend/genesys/gl846.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl846.cpp
++++ trunk/backend/genesys/gl846.cpp
+@@ -658,7 +658,7 @@ void CommandSetGl846::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+
+ DBG(DBG_info, "%s: total bytes to send = %zu\n", __func__, dev->total_bytes_to_read);
+ }
+Index: trunk/backend/genesys/gl847.cpp
+===================================================================
+--- trunk.orig/backend/genesys/gl847.cpp
++++ trunk/backend/genesys/gl847.cpp
+@@ -624,7 +624,7 @@ void CommandSetGl847::init_regs_for_scan
+ dev->session = session;
+
+ dev->total_bytes_read = 0;
+- dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines;
++ dev->total_bytes_to_read = (size_t)session.output_line_bytes_requested * (size_t)session.params.lines;
+
+ DBG(DBG_info, "%s: total bytes to send = %zu\n", __func__, dev->total_bytes_to_read);
+ }
diff --git a/debian/patches/0200-disable-check-equal-stderr.patch b/debian/patches/0200-disable-check-equal-stderr.patch
new file mode 100644
index 0000000..3f27ca5
--- /dev/null
+++ b/debian/patches/0200-disable-check-equal-stderr.patch
@@ -0,0 +1,23 @@
+Description: Build fails on GCC12:
+.
+minigtest.h:43:29: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const std::vector<long unsigned int>’)
+minigtest.h:43:29: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const std::vector<unsigned char>’)
+minigtest.h:43:29: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const genesys::Pixel’)
+minigtest.h:43:29: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const genesys::RawPixel’)
+minigtest.h:43:29: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘const genesys::PixelFormat’)
+.
+Simply suppressing the print of the mismatch is the lowest effort workaround.
+Author: Nathan Pratta Teodosio <nathan.teodosio@canonical.com>
+Bug: 1013034
+Forwarded: No
+
+--- a/testsuite/backend/genesys/minigtest.h
++++ b/testsuite/backend/genesys/minigtest.h
+@@ -40,7 +40,6 @@
+ s_num_failures++;
+ std::cerr << "FAILURE at ";
+ print_location(std::cerr, function, path, line);
+- std::cerr << " :\n" << t << " != " << u << "\n\n";
+ } else {
+ s_num_successes++;
+ std::cerr << "SUCCESS at ";
diff --git a/debian/patches/0600-scanimage_manpage.patch b/debian/patches/0600-scanimage_manpage.patch
new file mode 100644
index 0000000..6e8cc23
--- /dev/null
+++ b/debian/patches/0600-scanimage_manpage.patch
@@ -0,0 +1,21 @@
+Description: Add remark to options.
+Author: Jörg Frings-Fürst <debian@jff-webhosting.net>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=418630
+Forwarded: not-needed
+Last-Update: 2015-01-18
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/doc/scanimage.man
+===================================================================
+--- trunk.orig/doc/scanimage.man
++++ trunk/doc/scanimage.man
+@@ -75,6 +75,9 @@ To print all available options:
+ scanimage \-h
+
+ .SH OPTIONS
++\fBRemark:\fR Parameter are defined by the backends. So are \-\-mode Gray and \-\-mode Grayscale in use.
++Please read the backend documentation first.
++
+ Parameters are separated by a blank from single-character options (e.g.
+ .BR "\-d epson" )
+ and by a "=" from multi-character options (e.g.
diff --git a/debian/patches/0605-fix_groff-warnings.patch b/debian/patches/0605-fix_groff-warnings.patch
new file mode 100644
index 0000000..1e0ac17
--- /dev/null
+++ b/debian/patches/0605-fix_groff-warnings.patch
@@ -0,0 +1,20 @@
+Description: Fix some groff warnings
+Author: Jörg Frings-Fürst <debian@jff.email>
+Bug: https://gitlab.com/sane-project/backends/-/issues/433
+Last-Update: 2021-02-17
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/doc/sane-artec_eplus48u.man
+===================================================================
+--- trunk.orig/doc/sane-artec_eplus48u.man
++++ trunk/doc/sane-artec_eplus48u.man
+@@ -44,8 +44,7 @@ or
+ You can find it on the installation CD that was provided by the manufacturer,
+ normally in the directory Win98, WinMe or similar.
+ If the Windows-driver is installed on your computer, then you can also
+-find the firmware file under
+-.IR c:\\windows\\system32\\drivers .
++find the firmware file under c:\\windows\\system32\\drivers.
+
+ .SH CONFIGURATION
+ The contents of the
diff --git a/debian/patches/0705-kfreebsd.patch b/debian/patches/0705-kfreebsd.patch
new file mode 100644
index 0000000..34a510b
--- /dev/null
+++ b/debian/patches/0705-kfreebsd.patch
@@ -0,0 +1,17 @@
+description: Fix build failure on kfreebsd (closes: #680234)
+author: Petr Salinger
+Index: trunk/backend/umax_pp_low.c
+===================================================================
+--- trunk.orig/backend/umax_pp_low.c
++++ trunk/backend/umax_pp_low.c
+@@ -72,8 +72,10 @@
+ #endif
+
+ #ifdef HAVE_MACHINE_CPUFUNC_H
++#ifndef __GLIBC__
+ #include <machine/cpufunc.h>
+ #endif
++#endif
+
+ #ifdef HAVE_I386_SET_IOPERM
+ #include <machine/sysarch.h>
diff --git a/debian/patches/0725-fix_link_60-libsane_rule.patch b/debian/patches/0725-fix_link_60-libsane_rule.patch
new file mode 100644
index 0000000..0b424e2
--- /dev/null
+++ b/debian/patches/0725-fix_link_60-libsane_rule.patch
@@ -0,0 +1,33 @@
+Description: Fix directory for 20-sane.hwdb
+Author: Jörg Frings-Fürst <debian@jff.email>
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=916239
+Forwarded: not-needed
+Last-Update: 2019-04-27
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+Index: trunk/tools/sane-desc.c
+===================================================================
+--- trunk.orig/tools/sane-desc.c
++++ trunk/tools/sane-desc.c
+@@ -3649,7 +3649,7 @@ print_udevhwdb_header (void)
+ ("#\n"
+ "# udev rules file for supported USB and SCSI devices\n"
+ "#\n"
+- "# For the list of supported USB devices see /usr/lib/udev/hwdb.d/20-sane.hwdb\n"
++ "# For the list of supported USB devices see /lib/udev/hwdb.d/20-sane.hwdb\n"
+ "#\n"
+ "# The SCSI device support is very basic and includes only\n"
+ "# scanners that mark themselves as type \"scanner\" or\n"
+Index: trunk/testsuite/tools/data/udev+hwdb.ref
+===================================================================
+--- trunk.orig/testsuite/tools/data/udev+hwdb.ref
++++ trunk/testsuite/tools/data/udev+hwdb.ref
+@@ -3,7 +3,7 @@
+ #
+ # udev rules file for supported USB and SCSI devices
+ #
+-# For the list of supported USB devices see /usr/lib/udev/hwdb.d/20-sane.hwdb
++# For the list of supported USB devices see /lib/udev/hwdb.d/20-sane.hwdb
+ #
+ # The SCSI device support is very basic and includes only
+ # scanners that mark themselves as type "scanner" or
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..d52a695
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,25 @@
+#0011-test.patch
+0195-genesys_fix_total_file_size_exceeding.patch
+0035-trim-libraries-in-sane-backends.pc.in.patch
+0040-remove_git.patch
+0100-source_spelling.patch
+0125-multiarch_dll_search_path.patch
+0175-fix_tests.patch
+0140-avahi.patch
+0145-avahi.patch
+#0600-scanimage_manpage.patch
+0705-kfreebsd.patch
+0725-fix_link_60-libsane_rule.patch
+0150-i386-test.patch
+0155-hurd_PATH_MAX.patch
+0045-disable_lock_test_at_build_time.patch
+0050-Use-python3-shebang.patch
+#0055-Fix_build_error.patch
+0060-cross.patch
+#0165-respect_local_only_parameter.patch
+#0170-return_empty_list_when_local_devices_requested.patch
+0605-fix_groff-warnings.patch
+#0180-gt68xx_fix_use-after-free_two_memleaks.patch
+0185-Change_output_from_sane-find-scanner.patch
+#0190-remove-kernel-driver-for-plustek_pp.patch
+0200-disable-check-equal-stderr.patch