Start a new thread, that tries to connect to the shared folder. Sleeps for 1 second between every try. 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() - 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 - 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. - This would also fix unmapping folder when sharing is disable. - We could just unmap the drive in webdavd when we stop it. - vd_agent could even tell if the webdavd is installed, and grey out the Share Folder button accordingaly. 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@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel