[sane-devel] Chained Network Sane?

Ralph Little skelband at gmail.com
Wed Aug 10 15:51:53 BST 2022


Hi

On 2022-08-09 20:27, Guy B wrote:
> So, I went ahead and gave this a try (specifically, option B) and it 
> seems to work perfectly well (both via the scanimage commandline and 
> gscan2pdf). I attempted to rig up enabling this with a flag, but 
> couldn't grok how sane's flag system worked from just staring at the 
> code. I've included the diff below in case it is helpful. For now, 
> I'll leave my dodgy "one-random custom-built so-file" setup in place, 
> but +1 for making this a mainline feature and thanks for 
> the assistance. It is most appreciated.
>

That's great. I will perhaps do a change for the net backend to allow to 
allow this to be enabled.
Probably a net.conf option.

Cheers,
Ralph

> -Guy
>
>
> diff --git a/backend/net.c b/backend/net.c
> index d16119a81..4acb92730 100644
> --- a/backend/net.c
> +++ b/backend/net.c
> @@ -120,6 +120,7 @@static int client_big_endian; /* 1 == big endian; 0 
> == little endian */
> static int server_big_endian; /* 1 == big endian; 0 == little endian */
> static int depth; /* bits per pixel */
> static int connect_timeout = -1; /* timeout for connection to saned */
> +static SANE_Bool reshare_net = SANE_FALSE; /* if true, reshare 
> network-connected */
>
> #ifndef NET_USES_AF_INDEP
> static int saned_port;
> @@ -1117,6 +1118,14 @@sane_init (SANE_Int * version_code, 
> SANE_Auth_Callback authorize)
>       DBG (2, "sane_init: connect timeout set to %d seconds from 
> env\n", connect_timeout);
>     }
>
> +  DBG (2, "sane_init: evaluating environment variable 
> SANE_NET_RESHARE\n");
> +  env = getenv("SANE_NET_RESHARE");
> +  if (env)
> +    {
> +      reshare_net = SANE_TRUE;
> +      DBG (2, "sane_init: resharing of net scanners enabled\n");
> +    }
> +
>   DBG (2, "sane_init: done\n");
>   return SANE_STATUS_GOOD;
> }
> @@ -1220,7 +1229,7 @@sane_get_devices (const SANE_Device *** 
> device_list, SANE_Bool local_only)
>
>   DBG (3, "sane_get_devices: local_only = %d\n", local_only);
>
> -  if (local_only)
> +  if (local_only && !reshare_net)
>     {
>       *device_list = empty_devlist;
>       return SANE_STATUS_GOOD;
>
> On Sun, Aug 7, 2022 at 7:39 AM Ralph Little <skelband at gmail.com> wrote:
>
>     Hi,
>
>     On 2022-08-02 12:46, Guy B wrote:
>>     I'm trying to determine if this setup can actually be made to
>>     function (and Googling has given no obvious answer).
>>
>>     Server A - connected to scanner via USB, exposed via network
>>           ↓
>>     Server B - connected to A via the "net" interface, re-exposes
>>     scanner to another net via "net" interface
>>          ↓
>>     Server C - connects to B via "net"
>>
>>     The reason that I'm trying to do this is because "A" in this use
>>     case is actually a VM running an ancient version of Ubuntu
>>     because that's the only place I can make the binary-only drivers
>>     work (and I don't want a 10+ year old version of Ubuntu exposed
>>     to /any/ network). "B" is then a real machine that I want to use
>>     to expose it to the rest of the network.
>>
>>     While I've had no trouble plumbing things through to "B", I can't
>>     figure out how (or if it is possible) to re-share the network
>>     scanner again.
>>
>>     -Guy
>
>     So to summarise:
>         - Server A (VM) will be running the binary driver and saned,
>         - Server B will be running SANE with the "net" backend
>     (configured to connect to Server A's saned) and also saned,
>         - Server C will be running SANE with the "net" backend
>     (configured to connect to Server B's saned).
>
>     Although this sounds reasonable, the only issue that I can see
>     with this setup is that saned running on Server B will not pick up
>     the devices through the "net" backend.
>     The reason for this is that saned is intended to advertise local
>     devices only and when asking the "net" backend for local devices,
>     it will simply return with an empty list.
>     Partly the reason for this is to stop deadly embrace loops where
>     the "net" backend and saned could conceivably keep re-advertising
>     each other's devices in an endless loop.
>
>     Without changing code, I don't see an obvious way around this
>     restriction. However, there are two ways you could get around this
>     in your circumstance if you are willing do some minor code changes
>     and rebuild.
>
>     Do one of:
>
>     A. Rebuild saned with a small change to the code here around line
>     1851 of saned.c:
>
>           sane_get_devices ((const SANE_Device ***) &reply.device_list,
>                     SANE_TRUE);
>
>     to
>
>           sane_get_devices ((const SANE_Device ***) &reply.device_list,
>                     SANE_FALSE);
>
>     This removes the restriction on local-only devices.
>
>     or:
>
>     B. Rebuild the net backend with a small change to the code around
>     line 1223 of net.c:
>
>       if (local_only)
>         {
>           *device_list = empty_devlist;
>           return SANE_STATUS_GOOD;
>         }
>
>     ...by removing this code entirely.
>
>     If you are willing to give this a try, I would say that changing
>     the net backend and using that is probably the easiest solution.
>     To give it a go, I would clone the backends repo, make the change,
>     build it, take the built net backend files (libsane-net.*) and
>     temporarily replace your regular ones on Server B with the built
>     ones so that Server B's saned will see them.
>     Probably not a good permanent solution but a place to start at least.
>
>     Actually, since we have had this question come up a couple of
>     times in the past, it might be an optional feature that we could
>     add, switched off by default, to the core code.
>
>     Anyway, let us know if you need help giving that a try.
>
>     Cheers,
>     Ralph
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/sane-devel/attachments/20220810/5192233f/attachment-0001.htm>


More information about the sane-devel mailing list