The bigger question is why does the kds driver return SANE_STATUS_JAMMED when the scanner is not jammed. Since it is closed source, we cannot know.
allan On Tue, Nov 1, 2011 at 11:42 PM, widman <widman at cecst.com> wrote: > A recurring problem with using saned over the network is an > incomprehensible "I/O error" with a variety of scanners. Using > a fresh install of Ubuntu lucid 10.04 and a freshly compiled > sane-backends 1.0.22, with a new Kodak i1210 scanner, I found > the following: > ?1. Locally, scanimage -L > ? ? detected the scanner correctly. > ?2. Locally, scanimage --device-name kds:i1210/i1220 --batch=foo%d.pnm > ? ? scanned every page correctly into local files. > ?3. Locally, scanimage --device-name net:localhost:kds:i1210/i1220 > --batch=foo%d.pnm > ? ? failed with "scanimage: sane_read: Error during device I/O." > ?4. Over the net, scanimage --device-name net:<ip of server>:kds:i1210/i1220 > --batch=foo%d.pnm > ? ? failed with "scanimage: sane_read: Error during device I/O." > > The following patch fixes the 4th situation (but not the 3rd) imperfectly: > the first > scanned page is lost completely. ?However, if the length is not set to zero, > the first > two pages are mixed together and only the third and subsequent pages of a > batch are > scanned and transmitted correctly. ?The patched version of sane is installed > into > /usr/local/sbin/ ?and the file /etc/xinetd.d/saned is updated accordingly: > ?# server ? ?= /usr/sbin/saned > ?server ? ? ?= /usr/local/sbin/saned > > Thus, this patch allows the scanner to be used over the net using sane at the > cost of > having to place a placeholder sheet before the first page that is to be > scanned (since > the first scanned page is discarded, the placeholder is discarded and the > first "real" > sheet is the second in the batch to be scanned). ?The questions > now are: > ?1) why is the status SANE_STATUS_JAMMED returned with loss of part of the > first page? > ?2) What can be done about it? > I do not think the Kodak i1210 scanner is responsible because it works > flawlessly via > its local usb connection and because the same error has been reported with > other scanners. > Please note that I did not test this patch by actually jamming the scanner to > make sure > it would signal the error. > > Thanks > > diff -rc sane-backends-1.0.22/frontend/saned.c > sane-backends-1.0.22.new/frontend/saned.c > *** sane-backends-1.0.22/frontend/saned.c ? ? ? 2010-12-01 17:49:58.000000000 > -0600 > --- sane-backends-1.0.22.new/frontend/saned.c ? 2011-11-01 21:55:34.000000000 > -0500 > *************** > *** 1753,1758 **** > --- 1753,1772 ---- > ? ? ? ? ?status = sane_read (be_handle, buf + reader, nbytes, &length); > ? ? ? ? ?DBG (DBG_INFO, > ? ? ? ? ? ? ? "do_scan: read %d bytes from scanner\n", length); > + ? ? ? ? /* 2011-11-01 L Widman */ > + ? ? ? ? ? // for some reason, the first bufferful comes with status > SANE_STATUS_JAMMED > + ? ? ? ? ? // which is separate from the scanner being empty later, and the > first page > + ? ? ? ? ? // is not read completely. > + ? ? ? ? ? // ? Setting the initial length to 0 essentially discards the > first page and > + ? ? ? ? ? // allows the remaining pages to be read and transmitted normally. > + ? ? ? ? ? // ? Note that reader == 4 only during the first iteration unless > it exceeds sizeof(buf) > + ? ? ? ? ? if( (reader == 4) && (status == SANE_STATUS_JAMMED) ){ > + ? ? ? ? ? ? DBG (DBG_INFO, > + ? ? ? ? ? ? ? ?"do_scan: accepting %d bytes from scanner despite status > %s\n", length, sane_strstatus(status)); > + ? ? ? ? ? ? status = SANE_STATUS_GOOD; > + ? ? ? ? ? ? length = 0; > + ? ? ? ? ? } > + ? ? ? ? /* 2011-11-01 L Widman */ > > ? ? ? ? ?reset_watchdog (); > > > > -- > sane-devel mailing list: sane-devel at lists.alioth.debian.org > http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/sane-devel > Unsubscribe: Send mail with subject "unsubscribe your_password" > ? ? ? ? ? ? to sane-devel-request at lists.alioth.debian.org > -- "The truth is an offense, but not a sin"