Module: wine Branch: master Commit: 18b66912b7f0c27cf5caca6c26295b9c915f6cfe URL: http://source.winehq.org/git/wine.git/?a=commit;h=18b66912b7f0c27cf5caca6c26...
Author: Alexandre Julliard julliard@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);