Проблема проявляется на нашей BSD-машине. Из-за неё, например, не работает Консультант со смонтированного ftp.
1. Надо выложить более нижнюю функцию, которая не работает. 2. Надо запустить winelocktest на каталоге NFS, доступном на запись.
Start test as STANDALONE for lockfile.wine file... No check VFS filesystem G_R G_R G_R G_W G_W G_W G_R|W G_R|W G_R|W S_R S_W S_R|W S_R S_W S_R|W S_R S_W S_R|W G_R uVL u. uVL u. u. u. u. u. u. S_R G_R u. u. u. uVL u. uVL u. u. u. S_W G_R uVL u. uVL uVL u. uVL uVL u. uVL S_R|W G_W u. uVL uVL u. u. u. u. u. u. S_R G_W u. u. u. u. uVL uVL u. u. u. S_W G_W u. uVL uVL u. uVL uVL u. uVL uVL S_R|W G_R|W u. u. uVL u. u. u. u. u. u. S_R G_R|W u. u. u. u. u. uVL u. u. u. S_W G_R|W u. u. uVL u. u. uVL u. u. uVL S_R|W
В той же директории (запись разрешена) запуск теста проваливается: trace:file:FindFirstFileExW L"F:\\DISTR\\DIN\\ARB00001.DIN" 0 0x67faf0 0 0x0 0 trace:file:RtlDosPathNameToNtPathName_U (L"F:\\DISTR\\DIN\\ARB00001.DIN",0x67fa70,0x67fa7c,0x0) trace:file:RtlGetFullPathName_U (L"F:\\DISTR\\DIN\\ARB00001.DIN" 520 0x67f7f0 0x67fa7c) trace:ntdll:NtCreateFile handle=0x1208e4 access=80000000 name=L"\\??\\F:\\DISTR\\DIN\\" objattr=00000040 root=0x0 sec=0x0 io=0x67fa68 alloc_size=0x0 attr=00000000 sharing=00000003 disp=1 options=00000021 ea=0x0.0x00000000 trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\DISTR\\DIN\\" -> "/home/builder/.wine/dosdevices/f:/DISTR/DIN/" trace:file:WriteFile 0x8 0x67f900 7 0x67fd08 0x0 trace:ntdll:NtWriteFile (0x8,0x0,0x0,0x0,0x67f8c0,0x67f900,0x00000007,0x0,0x0)! Error
тест надо положить в репозиторий wine-etersoft-devel
SERVER_START_REQ( create_file ) { req->access = access; req->attributes = attr->Attributes; req->sharing = sharing; req->create = disposition; req->options = options; req->attrs = attributes; wine_server_add_data( req, &objattr, sizeof(objattr) ); if (objattr.sd_len) wine_server_add_data( req, sd, objattr.sd_len ); wine_server_add_data( req, unix_name.Buffer, unix_name.Length ); io->u.Status = wine_server_call( req ); *handle = reply->handle; } SERVER_END_REQ; При вызове из FindFirstFile() возвращается неправильный io->u.Status
Вот от вызова FindFirstFile до ошибки лог (+file,+server): trace:file:FindFirstFileExW L"test.txt" 0 0x67fad0 0 0x0 0 trace:file:RtlDosPathNameToNtPathName_U (L"test.txt",0x67fa50,0x67fa5c,0x0) trace:file:RtlGetFullPathName_U (L"test.txt" 520 0x67f7d0 0x67fa5c) trace:file:wine_nt_to_unix_file_name L"\\??\\N:\\kondratyuk\\" -> "/home/lav/.wine/dosdevices/n:/kondratyuk/" 000b: create_file( access=80000000, attributes=00000040, sharing=00000003, create=1, options=00000021, attrs=00000000, objattr={rootdir=0x0,sd={},name=L""}, filename="/home/lav/.wine/dosdevices/n:/kondratyuk/" ) 000b: create_file() = SHARING_VIOLATION { handle=0x0 } trace:file:WriteFile 0x8 0x67f8e0 19 0x67fce8 0x0 Error: not finded
Created attachment 233 [details] Тест на FindFirstFile() При запуске этого теста на NFS-разделе в BSD, получаем ошибку.
Created attachment 234 [details] Скомпилированный тест
Проявляется только в закрытой части. В свободной всё нормально работает.
Исправлено в новой сборке * Sat Dec 29 2007 Vitaly Lipatov <lav@altlinux.ru> 1.0.8-alt6 - now fail program if use CIFS without our linux-cifs - fix file locking on FreeBSD (fix eterbug #1026) нам передавался дескриптор на каталог, а мы пытались установить на него блокировку, что не получалось.