How to Fix the "invalid argument" Error with Sane and XSane
Errors with sane
, xsane
,
and scanimage
You try to start using your scanner with xsane
and all you get is a pop-up window with a cryptic message.
Or you do some Google searching and find suggestions to
use scanimage
to first detect and list
and to then test what it finds.
But the second command produces this same vague
error message about an "Invalid argument":
# scanimage -L device `artec_eplus48u:libusb:009:005' is a Memorex MEM 48U flatbed scanner # scanimage --test Failed to open device 'artec_eplus48u:libusb:009:005': Invalid argument
Here is how to fix the problem.
Find and verify the group associated with your scanner
Use the lsusb
command to find your
USB-connected scanner.
Below is the relevant line of output on my system.
# lsusb [... several lines deleted ...] Bus 009 Device 005: ID 05d8:4005 Ultima Electronics Corp. MEM48U [... several lines deleted ...]
Notice the 3-digit bus and device numbers. Yours, of course, is probably different, and if I unplug mine and plug it back in again it will get a new device number. Change the bus and device numbers in the following example commands and output as appropriate for your system.
Verify that your scanner is group-writeable, and see which
group is associated with its device.
The devices for USB bus 009 are in /dev/bus/usb/009
:
# ls -l /dev/bus/usb/009 total 0 crw-rw-r-- 1 root root 189, 1024 Jul 1 16:02 001 crw-rw-r-- 1 root root 189, 1025 Jul 1 16:02 002 crw-rw-r--+ 1 root scanner 189, 1028 Jul 1 16:18 005
Notice the "+", indicating that the KDE display manager has set up some extended attributes for me. Let's see what they are:
# getfacl /dev/bus/usb/009/005 # file: dev/bus/usb/009/005 # owner: root # group: scanner user::rw- user:cromwell:rw- group::rw- mask::rw- other::r--
It looks like I already have read/write access to the device!
So I would not really need to add myself to the
scanner
group as shown below, but there's
no harm in also doing that.
Add your user(s) to group scanner
You can do this with the usermod
command,
or simply by editing /etc/group
.
Add your user to the group associated with the detected
scanner device, change scanner
if necessary
to lp
or whatever group you saw in the
ls
output.
Note: you must log off and log back on
for the change to take full effect.
Run the id
command and verify that you are now
in the appropriate group.
Verify Your Sane Configuration
Notice that you have a set of files in /etc/sane.d
named for the different models.
I have a low-end USB scanner branded as Memorex on the cover
and as Memorex MEM48U on the bottom of its case, but it was
reported in the lsusb
output as Ultima
Electronics Corporation.
# lsusb [... several lines deleted ...] Bus 009 Device 005: ID 05d8:4005 Ultima Electronics Corp. MEM48U [... several lines deleted ...]
Notice the two hexadecimal strings: 05d8:4005. Those are manufacturer and product codes. Let's see if our system already knows what they mean:
# grep '05d8.*4005' /etc/sane.d/*.conf /etc/sane.d/artec_eplus48u.conf:usb 0x05d8 0x4005
Ahah! It's really from Artec, an E+ 48U scanner.
Look through its configuration file, you will see the comment "This scanner is also sold as Tevion MD 9693, Medion MD 9705, Medion MD 9693, Medion MD4394" regarding a product ID of 0x4003, and then "Since the Trust Easy Webscan 19200 uses a different product id, we add another usb section here" for product ID 0x4006", then that 0x4005 means a Memorex Mem48U, 0x4007 means Trust 240H Easy Webscan Gold, 0x4009 means UMAX AstraSlim SE, 0x4004 means Artec E+ Pro, 0x4010 means UMAX AstraSlim 1200 SE, and 0x4011 means Yakumo Scan50.
Notice that each stanza has a line like the following:
option artecFirmwareFile /usr/share/sane/artec_eplus48u/Artec48.usb
Add the Needed Firmware File
Do you have that file?
If you have the file but you are still getting the
"invalid argument" error message, verify the ownership
and permissions.
Maybe you need to make it readable by at least group
scanner
if not the world.
If you are still puzzled because you have the file and
it seems to be readable, you might try running
scanimage
through strace
and
verifying what is getting in the way.
Who can predict all the things that might go wrong,
possibly SELinux is getting in the way.
But most likely the problem is that the file is not there, you need to add it.
Ask yum
to tell you which package provides
that file:
# yum provides /usr/share/sane/artec_eplus48u/Artec48.usb
Or, on Mageia or another urpm*
based system,
use urpmf
:
# urpmf /usr/share/sane/artec_eplus48u/Artec48.usb
If your distribution does not include this firmware file,
don't panic.
As long as you can track down the file, you can add it.
Create the needed subdirectory under /usr/share/sane
,
download the file, extract it from a zip package if that's
how it came, put it in the right place, and make it owned
by root
and world-readable.
If you have the same model of scanner, use one of the
following.
If not, search for the firmware file for what you
do have through Google.