Alexandre Julliard : winecfg: Store the Unix device if any in the drive configuration.

Alexandre Julliard julliard at winehq.org
Fri Oct 24 08:12:21 CDT 2008


Module: wine
Branch: master
Commit: 18b66912b7f0c27cf5caca6c26295b9c915f6cfe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=18b66912b7f0c27cf5caca6c26295b9c915f6cfe

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Oct 23 16:19:36 2008 +0200

winecfg: Store the Unix device if any in the drive configuration.

---

 programs/winecfg/drive.c       |   35 ++++++++++++++++++++++++++---------
 programs/winecfg/drivedetect.c |   16 ++++++++++------
 programs/winecfg/driveui.c     |    4 ++--
 programs/winecfg/winecfg.h     |    4 +++-
 4 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/programs/winecfg/drive.c b/programs/winecfg/drive.c
index 35f013b..7ee9a0e 100644
--- a/programs/winecfg/drive.c
+++ b/programs/winecfg/drive.c
@@ -93,19 +93,22 @@ long drive_available_mask(char letter)
   return result;
 }
 
-BOOL add_drive(char letter, const char *targetpath, const WCHAR *label, DWORD serial, DWORD type)
+BOOL add_drive(char letter, const char *targetpath, const char *device, const WCHAR *label,
+               DWORD serial, DWORD type)
 {
     int driveIndex = letter_to_index(letter);
 
     if(drives[driveIndex].in_use)
         return FALSE;
 
-    WINE_TRACE("letter == '%c', unixpath == '%s', label == %s, serial == %08x, type == %d\n",
-               letter, targetpath, wine_dbgstr_w(label), serial, type);
+    WINE_TRACE("letter == '%c', unixpath == %s, device == %s, label == %s, serial == %08x, type == %d\n",
+               letter, wine_dbgstr_a(targetpath), wine_dbgstr_a(device),
+               wine_dbgstr_w(label), serial, type);
 
     drives[driveIndex].letter   = toupper(letter);
     drives[driveIndex].unixpath = strdupA(targetpath);
-    drives[driveIndex].label    = strdupW(label);
+    drives[driveIndex].device   = device ? strdupA(device) : NULL;
+    drives[driveIndex].label    = label ? strdupW(label) : NULL;
     drives[driveIndex].serial   = serial;
     drives[driveIndex].type     = type;
     drives[driveIndex].in_use   = TRUE;
@@ -119,6 +122,8 @@ void delete_drive(struct drive *d)
 {
     HeapFree(GetProcessHeap(), 0, d->unixpath);
     d->unixpath = NULL;
+    HeapFree(GetProcessHeap(), 0, d->device);
+    d->device = NULL;
     HeapFree(GetProcessHeap(), 0, d->label);
     d->label = NULL;
     d->serial = 0;
@@ -316,7 +321,7 @@ void load_drives(void)
         c = targetpath;
         do if (*c == '\\') *c = '/'; while (*c++);
 
-        add_drive(*devices, targetpath, volname, serial, get_drive_type(devices[0]) );
+        add_drive(*devices, targetpath, NULL, volname, serial, get_drive_type(devices[0]) );
 
         len -= lstrlenW(devices);
         devices += lstrlenW(devices);
@@ -354,7 +359,7 @@ void load_drives(void)
         buff[cnt] = '\0';
 
         WINE_TRACE("found broken symlink %s -> %s\n", path, buff);
-        add_drive('A' + i, buff, NULL, 0, DRIVE_UNKNOWN);
+        add_drive('A' + i, buff, NULL, NULL, 0, DRIVE_UNKNOWN);
 
         drivecount++;
     }
@@ -388,16 +393,28 @@ void apply_drive_changes(void)
         drives[i].modified = FALSE;
 
         len = sizeof(*ioctl);
-        if (drives[i].in_use) len += strlen(drives[i].unixpath) + 1;
+        if (drives[i].in_use)
+        {
+            len += strlen(drives[i].unixpath) + 1;
+            if (drives[i].device) len += strlen(drives[i].device) + 1;
+        }
         if (!(ioctl = HeapAlloc( GetProcessHeap(), 0, len ))) continue;
         ioctl->size = len;
         ioctl->letter = 'a' + i;
         ioctl->device_offset = 0;
         if (drives[i].in_use)
         {
+            char *ptr = (char *)(ioctl + 1);
+
             ioctl->type = drives[i].type;
-            ioctl->mount_point_offset = sizeof(*ioctl);
-            strcpy( (char *)(ioctl + 1), drives[i].unixpath );
+            strcpy( ptr, drives[i].unixpath );
+            ioctl->mount_point_offset = ptr - (char *)ioctl;
+            if (drives[i].device)
+            {
+                ptr += strlen(ptr) + 1;
+                strcpy( ptr, drives[i].device );
+                ioctl->device_offset = ptr - (char *)ioctl;
+            }
         }
         else
         {
diff --git a/programs/winecfg/drivedetect.c b/programs/winecfg/drivedetect.c
index 9a2b451..1c03b6f 100644
--- a/programs/winecfg/drivedetect.c
+++ b/programs/winecfg/drivedetect.c
@@ -235,7 +235,7 @@ static void ensure_root_is_mapped(void)
         {
             if (!drives[letter - 'A'].in_use) 
             {
-                add_drive(letter, "/", NULL, 0, DRIVE_FIXED);
+                add_drive(letter, "/", NULL, NULL, 0, DRIVE_FIXED);
                 WINE_TRACE("allocated drive %c as the root drive\n", letter);
                 break;
             }
@@ -264,7 +264,7 @@ static void ensure_home_is_mapped(void)
         {
             if (!drives[letter - 'A'].in_use)
             {
-                add_drive(letter, home, NULL, 0, DRIVE_FIXED);
+                add_drive(letter, home, NULL, NULL, 0, DRIVE_FIXED);
                 WINE_TRACE("allocated drive %c as the user's home directory\n", letter);
                 break;
             }
@@ -292,7 +292,7 @@ static void ensure_drive_c_is_mapped(void)
         WCHAR label[64];
         LoadStringW (GetModuleHandle (NULL), IDS_SYSTEM_DRIVE_LABEL, label,
                      sizeof(label)/sizeof(label[0]));
-        add_drive('C', "../drive_c", label, 0, DRIVE_FIXED);
+        add_drive('C', "../drive_c", NULL, label, 0, DRIVE_FIXED);
     }
     else
     {
@@ -330,7 +330,8 @@ int autodetect_drives(void)
     {
         char letter;
         int type;
-        
+        char *device = NULL;
+
         WINE_TRACE("ent->mnt_dir=%s\n", ent->mnt_dir);
 
         if (should_ignore_fstype(ent->mnt_type)) continue;
@@ -355,8 +356,11 @@ int autodetect_drives(void)
             return FALSE;
         }
 
-        WINE_TRACE("adding drive %c for %s, type %s\n", letter, ent->mnt_dir, ent->mnt_type);
-        add_drive(letter, ent->mnt_dir, NULL, 0, type);
+        if (type == DRIVE_CDROM) device = ent->mnt_fsname;
+
+        WINE_TRACE("adding drive %c for %s, device %s, type %s\n",
+                   letter, ent->mnt_dir, device, ent->mnt_type);
+        add_drive(letter, ent->mnt_dir, device, NULL, 0, type);
 
         /* working_mask is a map of the drive letters still available. */
         working_mask &= ~DRIVE_MASK_BIT(letter);
diff --git a/programs/winecfg/driveui.c b/programs/winecfg/driveui.c
index 8443537..a15d599 100644
--- a/programs/winecfg/driveui.c
+++ b/programs/winecfg/driveui.c
@@ -315,9 +315,9 @@ static void on_add_click(HWND dialog)
         WCHAR label[64];
         LoadStringW (GetModuleHandle (NULL), IDS_SYSTEM_DRIVE_LABEL, label,
                      sizeof(label)/sizeof(label[0]));
-        add_drive(new, "../drive_c", label, 0, DRIVE_FIXED);
+        add_drive(new, "../drive_c", NULL, label, 0, DRIVE_FIXED);
     }
-    else add_drive(new, "/", NULL, 0, DRIVE_UNKNOWN);
+    else add_drive(new, "/", NULL, NULL, 0, DRIVE_UNKNOWN);
 
     fill_drives_list(dialog);
 
diff --git a/programs/winecfg/winecfg.h b/programs/winecfg/winecfg.h
index 807caf7..b0e2e40 100644
--- a/programs/winecfg/winecfg.h
+++ b/programs/winecfg/winecfg.h
@@ -97,6 +97,7 @@ struct drive
 {
     char letter;
     char *unixpath;
+    char *device;
     WCHAR *label;
     DWORD serial;
     DWORD type; /* one of the DRIVE_ constants from winbase.h  */
@@ -108,7 +109,8 @@ struct drive
 #define DRIVE_MASK_BIT(B) (1 << (toupper(B) - 'A'))
 
 long drive_available_mask(char letter);
-BOOL add_drive(char letter, const char *targetpath, const WCHAR *label, DWORD serial, DWORD type);
+BOOL add_drive(char letter, const char *targetpath, const char *device,
+               const WCHAR *label, DWORD serial, DWORD type);
 void delete_drive(struct drive *pDrive);
 void apply_drive_changes(void);
 BOOL browse_for_unix_folder(HWND dialog, WCHAR *pszPath);




More information about the wine-cvs mailing list