Summary: | При установке не перезаписываются символические ссылки на файлы | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Файловые операции | Assignee: | Виталий Перов <vitperov> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | minor | ||
Priority: | P4 | CC: | kondratyuk |
Version: | 1.0.9 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 777, 1877 |
Description
Vitaly Lipatov
2008-09-18 18:21:40 MSD
Проблема знакомая: файл скорее всего read-only, поэтому wine не может его перезаписать. ещё со стороны wine не отличить обычный файл от ссылки. Пробовал снять атрибут read-only перед перезаписью, но не получилось. Возможно проблема с правами доступа. Надо подробней в этом разобраться Проверил. Владелец ссылок root. При обращении к файлу wine просто переходит по ссылке. Поэтому права есть только для чтение! Как я уже говорил, внутри wine невозможно определить ссылка это или файл, поэтому и ссылкой внутри wine невозможно ничего сделать. Думаю, единственный выход здесь - убрать все ссылки ещё надо проверить возможность удалять ссылку перед записью. Возможно это будет работать Протестировал работу с ссылками: - При выполнении CreateFileA с атрибутом CREATE_ALWAYS файл перезаписывается, что логично - При удалении файла удаляется ссылка, а не файл, что тоже логично - Но! если удалять read-only файл, то удаление проваливается! (код 5 = ACCESS DENIED DeleteFileW вызывает NtDeleteFile, а там содержится всего 2 строки: status = NtCreateFile( &hFile, GENERIC_READ | GENERIC_WRITE | DELETE, ObjectAttributes, &io, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN, FILE_DELETE_ON_CLOSE, NULL, 0 ); if (status == STATUS_SUCCESS) status = NtClose(hFile); Т.е при закрытии файла он должен удалиться. Но файл даже не открывается. Возвращаемый status = 0xc0000022 если убрать атрибуты GENERIC_READ | GENERIC_WRITE, и FILE_SHARE_READ | FILE_SHARE_WRITE, то файл без проблем удаляется. Проблема только в том, что в данном случае будут удаляться и read-only файлы, а этого быть не должно. можно попробовать использовать юниксовую функцию fstat для определения является ли файл ссылкой. Если является, то удалять его даже если он read-only возникли проблемы с макросом S_ISLNK, который определяет является ли файл ссылкой. Написал тест под линукс. Там этот макрос работает прекрасно. не знаю почему, но выражение (st.st_mode & S_IFLNK) всегда равно 32768 независимо от того файл это или ссылка. Кроме того st.st_mode тоже всегда равно 33060. Очень это странно нашёл свою ошибку: если в пути используются символические, то необходимо применять lstat вместо stat Теперь символические ссылки удаляются независимо от прав на запись исходного файла. Проверил исходное приложение: всё прекрасно устанавливается. Решение добавляет функцию +/****************************************************************** + * NTDLL_IsFileALink + * check wheather file is a Unix link + * Fix eterbug #2469 + */ +BOOL NTDLL_IsFileALink( POBJECT_ATTRIBUTES attr ) |