[sane-devel] sane_get_devices and sanei_usb_init

m. allan noah kitno455 at gmail.com
Thu Dec 11 21:36:47 UTC 2008

On Thu, Dec 11, 2008 at 4:24 PM, ABC <abc at telekom.ru> wrote:
> On Thu, Dec 11, 2008 at 04:06:24PM -0500, m. allan noah wrote:
>> On Mon, Dec 1, 2008 at 10:23 PM, ABC <abc at telekom.ru> wrote:
>> > First of all sanei_usb_init() is not designed to be used for rescanning
>> > after any other sanei_usb functions is called. It is just initialization
>> > and rescanning ability is not documented side effect. As stated in
>> > documentation: "Call this before any other sanei_usb function". So don't
>> > call it after. (This doesn't state it should be called just once, so we
>> > could rescan before first device is opened.)
>> sanei_usb_init() will blast the existing info, and assign all new
>> device indexes to whatever it finds.
> Exactly how it works now.
>> However, sanei_usb_init() is only
>> called by backends in sane_init() and sane_get_devices(). A frontend
>> will only call sane_init() once, so that is not a problem, and the
>> sane standard says this about sane_get_devices():
>> The returned list is guaranteed to remain unchanged and valid until
>> (a) another call to this function is performed or (b) a call to
>> sane_exit() is performed.
> This don't says calling sane_get_devices will or should break any
> already opened device.

That is strongly implied. Why else would it bother to guarantee only
half of the cycle?

>> So, if you call sane_get_devices() twice, you cannot complain that any
>> devices you have open don't work anymore.
> I can complain about that, since list of name/vendor/model/type of all
> available devices is logically not related to any already opened
> device.

Good point, but not what the standard implies above.

>> However, you have a valid point that most backends only call
>> sanei_usb_init() in sane_init(), and I think that should change.
> In backend I'm writing I call sanei_usb_init multiple times (in each
> sane_get_devices) only if I don't have opened devices. I think that's ok.

Unfortunately, that is not enough. if a person has another brand of
scanner on their machine, alongside yours, and they open the other
scanner and then call sane_get_devices(), your backend won't know.
Then you will blast the list with the other backend's open device in

"The truth is an offense, but not a sin"

More information about the sane-devel mailing list