GUACAMOLE-446: Merge changes adding support for overriding default RDP virtual drive name.
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c
index 74e27fd..c107295 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c
@@ -25,6 +25,7 @@
 #include "rdp_status.h"
 
 #include <freerdp/utils/svc_plugin.h>
+#include <guacamole/unicode.h>
 
 #ifdef ENABLE_WINPR
 #include <winpr/stream.h>
@@ -100,22 +101,23 @@
 void guac_rdpdr_fs_process_query_attribute_info(guac_rdpdr_device* device, wStream* input_stream,
         int file_id, int completion_id) {
 
+    int name_len = guac_utf8_strlen(device->device_name);
+    
     wStream* output_stream = guac_rdpdr_new_io_completion(device,
-            completion_id, STATUS_SUCCESS, 16 + GUAC_FILESYSTEM_NAME_LENGTH);
+            completion_id, STATUS_SUCCESS, 16 + name_len);
 
     guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG,
             "%s: [file_id=%i]",
             __func__, file_id);
 
-    Stream_Write_UINT32(output_stream, 12 + GUAC_FILESYSTEM_NAME_LENGTH);
+    Stream_Write_UINT32(output_stream, 12 + name_len);
     Stream_Write_UINT32(output_stream,
               FILE_UNICODE_ON_DISK
             | FILE_CASE_SENSITIVE_SEARCH
             | FILE_CASE_PRESERVED_NAMES); /* FileSystemAttributes */
     Stream_Write_UINT32(output_stream, GUAC_RDP_FS_MAX_PATH ); /* MaximumComponentNameLength */
-    Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH);
-    Stream_Write(output_stream, GUAC_FILESYSTEM_NAME,
-            GUAC_FILESYSTEM_NAME_LENGTH);
+    Stream_Write_UINT32(output_stream, name_len);
+    Stream_Write(output_stream, device->device_name, name_len);
 
     svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream);
 
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c
index 85787db..e064d4d 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c
@@ -119,7 +119,7 @@
     
 }
 
-void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr) {
+void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr, char* drive_name) {
 
     guac_client* client = rdpdr->client;
     guac_rdp_client* rdp_client = (guac_rdp_client*) client->data;
@@ -131,7 +131,7 @@
     /* Init device */
     device->rdpdr       = rdpdr;
     device->device_id   = id;
-    device->device_name = "Guacamole Filesystem";
+    device->device_name = drive_name;
     int device_name_len = guac_utf8_strlen(device->device_name);
     device->device_type = RDPDR_DTYP_FILESYSTEM;
     device->dos_name = "GUACFS\0\0";
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h
index ca3dd30..f990806 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h
@@ -41,8 +41,14 @@
 /**
  * Registers a new filesystem device within the RDPDR plugin. This must be done
  * before RDPDR connection finishes.
+ * 
+ * @param rdpdr
+ *     The RDP device redirection plugin with which to register the device.
+ * 
+ * @param drive_name
+ *     The name of the redirected drive to display in the RDP connection.
  */
-void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr);
+void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr, char* drive_name);
 
 #endif
 
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h
index 8f27652..1e48924 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h
@@ -77,12 +77,6 @@
 #define GUAC_PRINTER_DRIVER_LENGTH 50
 
 /**
- * Name of the filesystem.
- */
-#define GUAC_FILESYSTEM_NAME          "G\0u\0a\0c\0a\0m\0o\0l\0e\0\0\0"
-#define GUAC_FILESYSTEM_NAME_LENGTH   20
-
-/**
  * Label of the filesystem.
  */
 #define GUAC_FILESYSTEM_LABEL          "G\0U\0A\0C\0F\0I\0L\0E\0"
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
index 611d21a..4901dec 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
@@ -100,7 +100,7 @@
 
     /* Register drive if enabled */
     if (rdp_client->settings->drive_enabled)
-        guac_rdpdr_register_fs(rdpdr);
+        guac_rdpdr_register_fs(rdpdr, rdp_client->settings->drive_name);
 
     /* Log that printing, etc. has been loaded */
     guac_client_log(client, GUAC_LOG_INFO, "guacdr connected.");
diff --git a/src/protocols/rdp/rdp_settings.c b/src/protocols/rdp/rdp_settings.c
index 62fa1e2..a3bd348 100644
--- a/src/protocols/rdp/rdp_settings.c
+++ b/src/protocols/rdp/rdp_settings.c
@@ -54,6 +54,7 @@
     "enable-printing",
     "printer-name",
     "enable-drive",
+    "drive-name",
     "drive-path",
     "create-drive-path",
     "console",
@@ -198,6 +199,12 @@
      * otherwise.
      */
     IDX_ENABLE_DRIVE,
+    
+    /**
+     * The name of the virtual driver that will be passed through to the
+     * RDP connection.
+     */
+    IDX_DRIVE_NAME,
 
     /**
      * The local system path which will be used to persist the
@@ -809,6 +816,11 @@
     settings->drive_enabled =
         guac_user_parse_args_boolean(user, GUAC_RDP_CLIENT_ARGS, argv,
                 IDX_ENABLE_DRIVE, 0);
+    
+    /* Name of the drive being passed through */
+    settings->drive_name =
+        guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv,
+                IDX_DRIVE_NAME, "Guacamole Filesystem");
 
     settings->drive_path =
         guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv,
@@ -990,6 +1002,7 @@
     /* Free settings strings */
     free(settings->client_name);
     free(settings->domain);
+    free(settings->drive_name);
     free(settings->drive_path);
     free(settings->hostname);
     free(settings->initial_program);
diff --git a/src/protocols/rdp/rdp_settings.h b/src/protocols/rdp/rdp_settings.h
index 5caffe9..d521a87 100644
--- a/src/protocols/rdp/rdp_settings.h
+++ b/src/protocols/rdp/rdp_settings.h
@@ -186,6 +186,11 @@
      * Whether the virtual drive is enabled.
      */
     int drive_enabled;
+    
+    /**
+     * The name of the virtual drive to pass through to the RDP connection.
+     */
+    char* drive_name;
 
     /**
      * The local system path which will be used to persist the