kernel32: Implement GetVolumePathName.
cdavis at mymail.mines.edu
Tue Oct 4 13:15:00 CDT 2011
On Oct 4, 2011, at 11:56 AM, Erich Hoover wrote:
> On Tue, Oct 4, 2011 at 11:36 AM, Charles Davis <cdavis at mymail.mines.edu> wrote:
>> On Oct 4, 2011, at 9:32 AM, Erich Hoover wrote:
>>> This patch implements GetVolumePathName by using the full folder
>>> path and working backward until stat() returns a different device.
>> Surely there's a better way. Can't you do a statfs(2)/statvfs(2) (for example) to find out the FS root? (I know that works on the BSDs and Mac OS, because their statfs/statvfs structures all have a field for that--f_mntonname.) Then you can map that path back to a Wine path, and return that. Of course, that won't work for fake drives (see below).
> I doubt it, the function needs to return the mount point along the
> given path (see MSDN). In the case of cross-device symbolic links
> your suggestion will not return the current path.
Ah, you're right. MSDN says that GetVolumePathName() returns the volume containing the target of the symlink... unless of course, the path is a remote one. (Same for mounted volumes.) But that isn't a common case, nor is it one that Wine even supports yet :).
>> At the very least, you should be caching this information, like I did when I added case-insensitive lookup support to Wine (see commit 4e44e153c5c78339f17baeabe22f2015cfc8737c). Because you call stat(2) on every single directory in a pathname (especially in the common case of the file being on the root device), calculating this from scratch is extremely expensive.
> I'm not sure this function is used enough to justify caching the
> results, as this is the first time I've noticed the FIXME on the
> console. If someone thinks that is the case then I can always make
> that a "part 2" patch.
>> And what about drive C? On Wine, that's not a device at all. It's a folder usually somewhere on the root device. In general, I don't see anything in your patch that accounts for fake drives like C:--the common case, I might add!
> If you pass it just the path to "C:\" then it will spit back "C:\",
> since it only encounters the one filesystem. If you pass something
> like "C:\windows\system32\" then it will spit back "C:\" unless the
> "windows" or "system32" folders are symbolic links to a folder on
> another drive.
Ah, I read your patch wrong. Never mind.
More information about the wine-devel