[Spice-devel] [phodav PATCH RFC] webdavd: Automount shared folder on Windows

Marc-André Lureau mlureau at redhat.com
Fri Jul 31 10:21:19 PDT 2015


Hi Lukas

----- Original Message -----
> Start a new thread, that tries to connect to the shared folder.
> Sleeps for 1 second between every try.

Why not assume that the webdav connection is present when entering the main loop (after a few seconds perhaps just in case the read returns an error)?

> Thread exits on succesful connect, or if the drive letter was already
> asigned.
> ---
> https://bugs.freedesktop.org/show_bug.cgi?id=90477
> 
> This is just RFC
> 
>  - The function needs a way to connect to proper drive letter
>     - NetUseAdd, or GetLogicalDrives()

It is assigned dynamically, no?

>  - I tried calling this function in callback, in g_task, but it seems, that
>    Windows can only succesfully map the drive, if the function is called
>    AFTER the first read (which blocks), that's why I decided to use a new
>    thread.
>      - This seems to be the only way to mount the drive in webdavd itself.
> 
>  - Currently, if the service maps the drive, the user can't disconnect it.
>     - This is most likely because service has SYSTEM privileges.
>     - Need a way to map the drive with user privileges

I am not sure this is a real problem.

> 
>  - Webdavd service on Windows doesn't notice, when the sharing is disabled.
>     - This could be fixed, if vd_agent handled the start and stop of
>       webdavd according to state of the Share Folder button in viewer.

Well, it should notice that connection is gone, the read returns an error. There might be a better way to wait until the connection is up instead (I remember I couldn't find one, but it should be doable).

>     - This would also fix unmapping folder when sharing is disable.
>        - We could just unmap the drive in webdavd when we stop it.

yes

>     - vd_agent could even tell if the webdavd is installed, and grey out the
>       Share Folder button accordingaly.

That would need some more thoughts indeed (I am not sure it's worth the effort).


Thanks!

>   Aditional comments on bugzilla.
> ---
>  Makefile.am           |  4 ++++
>  spice/spice-webdavd.c | 34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 38 insertions(+)
> 
> diff --git a/Makefile.am b/Makefile.am
> index 485417b..df9a73e 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -87,6 +87,10 @@ spice_webdavd_LDADD =		\
>  	$(PIE_LDFLAGS)		\
>  	$(NULL)
> 
> +if OS_WIN32
> +spice_webdavd_LDADD += -lnetapi32 -lmpr
> +endif
> +
>  deps.txt:
>  	$(AM_V_GEN)rpm -qa | grep $(host_os) | sort | unix2dos > $@
> 
> diff --git a/spice/spice-webdavd.c b/spice/spice-webdavd.c
> index c8fb795..373c5f4 100644
> --- a/spice/spice-webdavd.c
> +++ b/spice/spice-webdavd.c
> @@ -287,6 +287,38 @@ typedef struct ReadData
>    gssize size;
>  } ReadData;
> 
> +#ifdef G_OS_WIN32
> +static gpointer
> +map_drive (gpointer user_data)
> +{
> +  while(1) {
> +    char local_name[] = "Z:";
> +    char remote_name[] = "http://localhost:9843/";
> +    NETRESOURCE net_resource;
> +
> +    net_resource.dwType = RESOURCETYPE_DISK;
> +    net_resource.lpLocalName = local_name;
> +    net_resource.lpRemoteName = remote_name;
> +    net_resource.lpProvider = NULL;
> +
> +    g_usleep (G_USEC_PER_SEC);
> +
> +    DWORD retval = WNetAddConnection2(&net_resource, NULL, NULL,
> CONNECT_TEMPORARY);
> +
> +    if (retval == NO_ERROR) {
> +      g_debug("map_drive ok");
> +      break;
> +      } else if (retval == ERROR_ALREADY_ASSIGNED) {
> +      g_debug("map_drive already asigned");
> +      break;
> +    } else {
> +      g_debug("map_drive error %d", retval);
> +    }
> +  }
> +  return NULL;
> +}
> +#endif
> +
>  static void
>  read_thread (GSimpleAsyncResult *simple,
>               GObject            *object,
> @@ -836,6 +868,8 @@ service_main (DWORD argc, TCHAR *argv[])
>    service_status.dwWaitHint = 0;
>    SetServiceStatus (service_status_handle, &service_status);
> 
> +  g_thread_new ("map-drive", map_drive, NULL);
> +
>    while (!quit_service) {
>        run_service ();
>        g_usleep (G_USEC_PER_SEC);
> --
> 2.4.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list