[Spice-devel] [phodav PATCH 2/3 v6] spice-webdavd-windows: Check for mapped shared folder
Lukáš Venhoda
lvenhoda at redhat.com
Thu Apr 21 15:28:08 UTC 2016
From: Lukas Venhoda <lvenhoda at redhat.com>
Check whether Spice Folder is already mapped.
If yes, don't try to map another one.
---
Changes since v4:
- fixed indentation
- fixed * indentaion
Changes since v4:
- Moved some variables around
- Better debug message
- Fixed bug, that would cause the folder not to mount automatically
Changes since v3:
- changed function is_spice_folder_mapped to get_spice_folder_letter
- Now returns the mapped folder drive letter
- This can be used to call unmap_drive
- No need for global variable drive_letter
- Better handeling of adress string
- No hardcoded port
- Syntax cleanup
Changes since v2:
- New patch
---
spice/spice-webdavd.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 46 insertions(+), 4 deletions(-)
diff --git a/spice/spice-webdavd.c b/spice/spice-webdavd.c
index 88c29d0..bac8dbd 100644
--- a/spice/spice-webdavd.c
+++ b/spice/spice-webdavd.c
@@ -776,6 +776,42 @@ get_free_drive_letter(void)
return 0;
}
+static gchar
+get_spice_folder_letter(void)
+{
+ const guint32 max_mask = 1 << 25;
+ gchar local_name[3] = "z:";
+ gchar *spice_folder_name;
+ gchar spice_folder_letter = 0;
+ guint32 drives;
+ guint32 i;
+
+ drives = GetLogicalDrives ();
+ spice_folder_name = g_strdup_printf("\\\\localhost@%d\\DavWWWRoot", port);
+
+ for (i = 0; i < 26; i++)
+ {
+ gchar remote_name[MAX_SHARED_FOLDER_NAME_SIZE];
+ guint32 size = sizeof(remote_name);
+ guint32 mask = max_mask >> i;
+ if (drives & mask)
+ {
+ local_name[0] = 'z' - i;
+ if ((WNetGetConnection (local_name, remote_name, (LPDWORD)&size) == NO_ERROR) &&
+ (g_strcmp0 (remote_name, spice_folder_name) == 0))
+ {
+ spice_folder_letter = local_name[0];
+ g_debug ("Found Spice Shared Folder at %c drive", spice_folder_letter);
+ break;
+ }
+ }
+ }
+
+ g_free(spice_folder_name);
+
+ return spice_folder_letter;
+}
+
/* User is required to call netresource_free, when no longer needed. */
static void
netresource_init(NETRESOURCE *net_resource, const gchar drive_letter)
@@ -873,10 +909,16 @@ run_service (void)
#ifdef G_OS_WIN32
MapDriveData map_drive_data;
map_drive_data.cancel_map = g_cancellable_new ();
- GTask *map_drive_task = g_task_new (NULL, NULL, NULL, NULL);
- g_task_set_task_data (map_drive_task, &map_drive_data, NULL);
- g_task_run_in_thread (map_drive_task, map_drive_cb);
- g_object_unref (map_drive_task);
+
+ gchar drive_letter = get_spice_folder_letter ();
+
+ if (drive_letter == 0)
+ {
+ GTask *map_drive_task = g_task_new (NULL, NULL, NULL, NULL);
+ g_task_set_task_data (map_drive_task, &map_drive_data, NULL);
+ g_task_run_in_thread (map_drive_task, map_drive_cb);
+ g_object_unref (map_drive_task);
+ }
#endif
g_socket_service_start (socket_service);
--
2.5.5
More information about the Spice-devel
mailing list