[Spice-devel] [phodav PATCH RFC] webdavd: Automount shared folder on Windows
Lukas Venhoda
lvenhoda at redhat.com
Fri Jul 31 09:05:20 PDT 2015
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
More information about the Spice-devel
mailing list