arj запускается только через wineconsole, причём можно и так: C:\> wineconsole arj Иначе он зависает в бесконечном цикле: 000b:Call KERNEL32.ReadConsoleInputA(00000004,0034f694,00000001,0034f6a8) ret=7d8b11e7 000b: get_console_wait_event( ) 000b: get_console_wait_event() = INVALID_PARAMETER { handle=(nil) } 000b: select( flags=4, cookie=0x34f344, signal=(nil), timeout=infinite, handles={(nil)} ) 000b: select() = INVALID_HANDLE { timeout=infinite }
Добавляю зависимость на багу 442, которая была о том же.
Надо наверное что-то сделать, чтобы зависания не было. Вообще возможно что надо, как и в Windows, все консольные программы запускать в консоли. Как минимум, нужно воспроизвести ситуацию с ReadConsoleInput http://api.farmanager.com/ru/winapi/readconsoleinput.html
Думаю, полный цикл вот такой (на 22.12.07 зацикливается): 000b:trace:int:DOSVM_Loop waiting for action 000b:Call user32.MsgWaitForMultipleObjects(00000002,0034f688,00000000,ffffffff,000004ff) ret=7e88ed5c 000b: set_queue_mask( wake_mask=00000000, changed_mask=000004ff, skip_wait=0 ) 000b: set_queue_mask() = 0 { wake_bits=00000108, changed_bits=00000108 } 000b:Call winex11.drv.MsgWaitForMultipleObjectsEx(00000003,0034f3d8,ffffffff,000004ff,00000000) ret=7ee8d30b 000b:trace:sync:WaitForMultipleObjectsEx *handle=4, timeout=-1 000b: select( flags=4, cookie=0x34f0f0, signal=(nil), prev_apc=(nil), timeout=infinite, result={}, handles={0x4,0x80,0x84} ) 000b: select() = 0 { apc_handle=(nil), timeout=infinite, call={APC_NONE} } 000b:Ret winex11.drv.MsgWaitForMultipleObjectsEx() retval=00000000 ret=7ee8d30b 000b:Ret user32.MsgWaitForMultipleObjects() retval=00000000 ret=7e88ed5c 000b:Call KERNEL32.GetStdHandle(fffffff6) ret=7e88e741 000b:Ret KERNEL32.GetStdHandle() retval=00000004 ret=7e88e741 000b:Call KERNEL32.ReadConsoleInputA(00000004,0034f600,00000001,0034f614) ret=7e88e756 000b: get_console_wait_event( ) 000b: get_console_wait_event() = INVALID_PARAMETER { handle=(nil) } 000b: get_handle_fd( handle=(nil) ) 000b: get_handle_fd() = INVALID_HANDLE { type=0, removable=0, access=00000000, options=00000000 } 000b:trace:sync:WaitForSingleObject filetype=0 000b:trace:sync:WaitForMultipleObjectsEx *handle=0, timeout=-1 000b: select( flags=4, cookie=0x34f220, signal=(nil), prev_apc=(nil), timeout=infinite, result={}, handles={(nil)} ) 000b: select() = INVALID_HANDLE { apc_handle=(nil), timeout=infinite, call={APC_NONE} } 000b:trace:sync:WaitForSingleObject handle=0, ret=ffffffff 000b:Ret KERNEL32.ReadConsoleInputA() retval=00000000 ret=7e88e756
Проблема связана с использованием ReadConsoleInput, который не может работать без wineconsole. В багу http://bugs.winehq.org/show_bug.cgi?id=9178 есть патч, устраняющий проблему.
32-битная версия работает без проблем: $ wine arj.exe ARJ 3.10a (ARJ32) Copyright (c) 1990-2002 ARJ Software, Inc. May 31 2002 Registered to [Tagir R#1234] Long filenames enabled Processing archive: C:\arj.exe Archive created: 2002-05-31 17:11:16, modified: 2002-05-31 17:11:16 List of frequently used commands and switches. Type ARJ32 -? for more help. 16-битна тоже: $ wine ARJ.EXE ARJ 2.41 Copyright (c) 1990-93 Robert K Jung. Jun 03 1993 All Rights Reserved. U.S. Patent No. 5,140,321 and patent pending. *** This SHAREWARE program is NOT REGISTERED for use in a business, commercial, *** government, or institutional environment except for evaluation purposes.
Архиваторы для тестирования здесь: /var/ftp/pvt/Windows/Compressors