[sane-devel] sane-find-scanner and mustek parallel port devices

Jochen Eisinger jochen@penguin-breeder.org
Tue, 06 Apr 2004 20:24:53 +0200


This is a multi-part message in MIME format.
--------------070004080404080406040306
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Hi,

I just wrote a short patch to sane-find-scanner which detects mustek
parallel port devices. With sanei_pa4s2 it's possible to get a list of
possible ports. All the patch does is trying to open those ports using
the sanei_pa4s2 - the sanei_pa4s2 contains the whole low-level stuff, so
no device dependant code is included in sane-find-scanner.

In order to avoid problems with parallel port printers or other hardware
if no scanner is present, you have to give the switch -p to
sane-find-scanner if you want your scanner detected.

Example:

# sane-find-scanner -p -q
found possible Mustek parallel port scanner at "parport0"

Any comments on this?

kind regards
-- jochen

--------------070004080404080406040306
Content-Type: text/plain;
 name="sane-find-scanner.c.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="sane-find-scanner.c.patch"

--- ./tools/sane-find-scanner.c.orig	2004-04-06 20:23:43.000000000 +0200
+++ ./tools/sane-find-scanner.c	2004-04-06 20:23:47.000000000 +0200
@@ -44,6 +44,7 @@
 #include "../include/sane/sanei.h"
 #include "../include/sane/sanei_scsi.h"
 #include "../include/sane/sanei_usb.h"
+#include "../include/sane/sanei_pa4s2.h"
 
 #ifndef PATH_MAX
 # define PATH_MAX 1024
@@ -90,6 +91,7 @@
   fprintf (stderr, "\t-q: be quiet (print only devices, no comments)\n");
   fprintf (stderr, "\t-f: force opening devname as SCSI even if it looks "
 	   "like USB\n");
+  fprintf (stderr, "\t-p: enable scannig for parallel port devices\n");
   if (msg)
     fprintf (stderr, "\t%s\n", msg);
 }
@@ -781,10 +783,87 @@
 }
 #endif
 
+static int
+check_mustek_pp_device (void)
+{
+  const char **devices;
+  int ctr = 0, found = 0, scsi = 0;
+
+  if (verbose > 1)
+    printf ("searching for Mustek parallel port scanners:\n");
+
+  devices = sanei_pa4s2_devices ();
+
+  while (devices[ctr] != NULL) {
+    int fd;
+    SANE_Status result;
+
+    /* ordinary parallel port scanner type */
+    if (verbose > 1)
+      printf ("checking %s...", devices[ctr]);
+
+    result = sanei_pa4s2_open (devices[ctr], &fd);
+    
+    if (verbose > 1)
+      {
+        if (result != 0)
+  	  printf (" failed to open (%s)\n", sane_strstatus (result));
+        else
+	  printf (" open ok\n");
+      }
+
+    if (result == 0) {
+      printf ("found possible Mustek parallel port scanner at \"%s\"\n",
+              devices[ctr]);
+      found++;
+      sanei_pa4s2_close(fd);
+    }
+    
+    /* trying scsi over pp devices */
+    if (verbose > 1)
+      printf ("checking %s (SCSI emulation)...", devices[ctr]);
+
+    result = sanei_pa4s2_scsi_pp_open (devices[ctr], &fd);
+    
+    if (verbose > 1)
+      {
+        if (result != 0)
+  	  printf (" failed to open (%s)\n", sane_strstatus (result));
+        else
+	  printf (" open ok\n");
+      }
+
+    if (result == 0) {
+      printf ("found possible Mustek SCSI over PP scanner at \"%s\"\n",
+              devices[ctr]);
+      scsi++;
+      sanei_pa4s2_close(fd);
+    }
+
+    ctr++;
+  }
+
+  free(devices);
+
+  if (found > 0 && verbose > 0)
+    printf("\n  # Your Mustek parallel port scanner was detected.  It may or\n"
+           "  # may not be supported by SANE.  Please read the sane-mustek_pp\n"
+	   "  # man-page for setup instructions.\n");
+
+  if (scsi > 0 && verbose > 0)
+    printf("\n  # Your Mustek parallel port scanner was detected.  It may or\n"
+           "  # may not be supported by SANE.  Please read the sane-mustek_pp\n"
+	   "  # man-page for setup instructions.\n");
+
+  return (found > 0 || scsi > 0);
+
+}
+
 int
 main (int argc, char **argv)
 {
   char **dev_list, **usb_dev_list, *dev_name, **ap;
+  int enable_pp_checks = SANE_FALSE;
 
   prog_name = strrchr (argv[0], '/');
   if (prog_name)
@@ -815,6 +894,10 @@
 	  force = SANE_TRUE;
 	  break;
 
+	case 'p':
+	  enable_pp_checks = SANE_TRUE;
+	  break;
+
 	default:
 	  printf ("unknown option: -%c, try -h for help\n", (*ap)[1]);
 	  exit (0);
@@ -1218,9 +1301,19 @@
 	   "make sure that\n  # you have loaded a driver for your USB host "
 	   "controller and have installed a\n  # kernel scanner module.\n");
     }
+  if (enable_pp_checks == SANE_TRUE) 
+    {
+      if (!check_mustek_pp_device() && verbose > 0)
+        printf ("\n  # No Mustek parallel port scanners found. If you expected"
+                " something\n  # different, make sure the scanner is correctly"
+	        " connected to your computer\n  # and you have apropriate"
+	        " access rights.\n");
+    }
+  else if (verbose > 0)
+    printf ("\n  # Not checking for parallel port scanners.\n");
   if (verbose > 0)
-    printf ("\n  # Scanners connected to the parallel port or other "
-	    "proprietary ports can't be\n  # detected by this program.\n");
+    printf ("\n  # Most Scanners connected to the parallel port or other "
+	    "proprietary ports\n  # can't be detected by this program.\n");
   if (getuid ())
     if (verbose > 0)
       printf

--------------070004080404080406040306--