static BOOL set_unix_mount_point( struct dos_drive *drive, const char *mount_point ) { char *path, *p; BOOL modified = FALSE; if (!(path = get_dosdevices_path( &p ))) return FALSE; p[0] = 'a' + drive->drive; p[2] = 0; if (mount_point && mount_point[0]) { /* try to avoid unlinking if already set correctly */ if (!drive->unix_mount || strcmp( drive->unix_mount, mount_point )) { unlink( path ); symlink( mount_point, path ); modified = TRUE; } RtlFreeHeap( GetProcessHeap(), 0, drive->unix_mount ); drive->unix_mount = strdupA( mount_point ); if (drive->dosdev) set_mount_point_id( drive->dosdev, mount_point, strlen(mount_point) + 1 ); if (drive->volume) set_mount_point_id( drive->volume, mount_point, strlen(mount_point) + 1 ); } else { if (unlink( path ) != -1) modified = TRUE; RtlFreeHeap( GetProcessHeap(), 0, drive->unix_mount ); drive->unix_mount = NULL; if (drive->dosdev) set_mount_point_id( drive->dosdev, NULL, 0 ); if (drive->volume) set_mount_point_id( drive->volume, NULL, 0 ); } HeapFree( GetProcessHeap(), 0, path ); return modified; }
/* change the information for an existing volume */ static NTSTATUS set_volume_info( struct volume *volume, struct dos_drive *drive, const char *device, const char *mount_point, enum device_type type, const GUID *guid ) { void *id = NULL; unsigned int id_len = 0; struct disk_device *disk_device = volume->device; NTSTATUS status; if (type != disk_device->type) { if ((status = create_disk_device( type, &disk_device ))) return status; if (volume->mount) { delete_mount_point( volume->mount ); volume->mount = NULL; } if (drive && drive->mount) { delete_mount_point( drive->mount ); drive->mount = NULL; } delete_disk_device( volume->device ); volume->device = disk_device; } else { RtlFreeHeap( GetProcessHeap(), 0, disk_device->unix_device ); RtlFreeHeap( GetProcessHeap(), 0, disk_device->unix_mount ); } disk_device->unix_device = strdupA( device ); disk_device->unix_mount = strdupA( mount_point ); if (guid && memcmp( &volume->guid, guid, sizeof(volume->guid) )) { volume->guid = *guid; if (volume->mount) { delete_mount_point( volume->mount ); volume->mount = NULL; } } if (!volume->mount) volume->mount = add_volume_mount_point( disk_device->dev_obj, &disk_device->name, &volume->guid ); if (drive && !drive->mount) drive->mount = add_dosdev_mount_point( disk_device->dev_obj, &disk_device->name, drive->drive ); if (disk_device->unix_mount) { id = disk_device->unix_mount; id_len = strlen( disk_device->unix_mount ) + 1; } if (volume->mount) set_mount_point_id( volume->mount, id, id_len, -1 ); if (drive && drive->mount) set_mount_point_id( drive->mount, id, id_len, drive->drive ); return STATUS_SUCCESS; }