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.)
Second, we accessing devices just by index number, so if there is appeared new device indexes could get changed. And third, yes it clears internal structures, opened descriptors, whatever. As I understand nobody of backend writers code so sane_get_devices() could detect appearance of new devices in system. sanei_usb_init() is usually called in sane_init(), there is get and remmebers internally list (array) of present usb devices forever until program terminates. Moreover, backend don't have access to that list directly but only via attach callbacks, so config is parsed usually in sane_init() too, and all found devices get "attached" to backend. Now backend have list of devices that in practice can not be changed. In most backends sane_get_devices() only _rebuild_ linear array of pointers to that list created in sane_init. Actially that array doesn't need to be rebuilt each time, it would not change. But when you write backend for a first time you don't know that. You think "Why attach all devices in init if sane_get_devices should 'detect when new devices become available'?" You trying to code it "right" way, but later you realize it's don't work like this, at least for usb. On Tue, Dec 02, 2008 at 08:14:13AM +0900, Olaf Meeuwissen wrote: > "m. allan noah" <kitno455 at gmail.com> writes: > > > On Mon, Dec 1, 2008 at 12:10 AM, ABC <abc at telekom.ru> wrote: > >>> http://www.sane-project.org/html/doc012.html > >>> 4.3.3 sane_get_devices > >>> ... > >>> This function can be called repeatedly to detect when new devices > >>> become available. > >> > >> Nice writing but it is not possible with usb now, because sanei usb > >> infrastructure get list of devices only when sanei_usb_init() is called. > >> And it is not possible to call sanei_usb_init() more than once without > >> breaking already opened devices. > > > > how do they break? > > sanei_usb_open() returns an index into the devices array. That index > is passed to the sanei_usb I/O functions and sanei_usb_close() to find > which one of the devices you want to use. > Problem is that sanei_usb_init() memset()s the devices array. > > Hope this helps, > -- > Olaf Meeuwissen, LPIC-2 FLOSS Engineer -- AVASYS Corporation > FSF Associate Member #1962 Help support software freedom > http://www.fsf.org/jf?referrer=1962
