Kho tháng 5/2009
Thứ sáu, 29 Tháng năm năm 2009 19:47:29 ICT
Cross built gtk+. Finished a task that should have been done 5 months ago. Heh Windows gaim-ers, want to type Vietnamese? ;)
Thứ sáu, 29 Tháng năm năm 2009 11:00:31 ICT
If I die tomorrow, I'll be alright because I believe, that after we're gone, everything is gone. (Sorry Dream Theater, can't help)
Thứ năm, 21 Tháng năm năm 2009 19:44:52 ICT
56 lines to "scratch my itch" and other ~1000 lines just to prepare for that
Thứ tư, 20 Tháng năm năm 2009 13:09:58 ICT
need some air, getting crazy with these stupid TR/FMT stuff
Thứ ba, 19 Tháng năm năm 2009 06:11:34 ICT
Thơ thẩn: thân ta lạnh nhưng hồn ta ấm. Thực tế: hai tay tê cứng nhưng lưng chảy mồ hôi.
Thứ hai, 18 Tháng năm năm 2009 12:24:42 ICT
dayjob has been up to speed again (read: overloaded), given the number of mails I've sent out today.
Thứ sáu, 15 Tháng năm năm 2009 07:27:31 ICT
C-u M-x occur, you get occurences within context! #emacs suprises me everyday.
Chủ nhật, 10 Tháng năm năm 2009 21:40:28 EST
Cygwin và Busybox-w32
Cái sự busybox cho Windows cuối cùng dẫn đến một câu hỏi là: liệu có thể sử dụng rxvt trên Windows (vốn là ứng dụng Cygwin) làm terminal emulator cho busybox (cụ thể là ash và vi) hay không? Để trả lời, cần phải hiểu về cái gọi là tty trên Linux/Unix.
Một mặt, emulator chỉ đơn giản làm nhiệm vụ thông dịch ANSI escape sequence (còn có nhiều tên khác như VT100, VT102... nói chung cũng khác nhau chút đỉnh). Escape sequence là cách để ứng dụng "ra lệnh" cho terminal làm cái gì đó, ví dụ như xoá ô này, chuyển con trỏ đến chỗ này, đổi màu chỗ kia... nói chung là điều khiển phần hiển thị. Phần này cứ ghi thẳng ra stdout là xong.
Mặt khác, ứng dụng còn được quyền điều khiển đầu vào của terminal. Một
ví dụ cụ thể là chuyển chế độ nhập của terminal từ dòng sang kí
tự. Bình thường, terminal sẽ chờ đến khi nhấn Enter mới chuyển nguyên
một hàng cho ứng dụng. Ứng dụng kiểu như shell hoặc vi, sẽ đòi hỏi
nhận từng kí tự một, nên phải "ra lệnh" cho terminal. Phần lệnh này
không thông qua stdout mà qua hai hàm tcgetattr()
và
tcsetattr()
. Đây là chỗ đau đầu vì Windows hoàn toàn không có hai
hàm này. Cygwin tự giả lập lại hai hàm này.
Vậy ta đã đến rất rất gần, chỉ cần điều chỉnh đầu vào của terminal, là
có thể sử dụng rxvt cho busybox-w32. Tuy gần mà xa, vì tcgetattr()
và tcsetattr()
không xài được nếu không liên kết đến cygwin1.dll. Mà
liên kết đến cygwin1.dll là điều không thể.
Xét ở góc độ hệ điều hành, cả cygwin1.dll và msvcrt.dll (hay tính luôn
libc nếu thích) cung cấp C API cho ứng dụng, bao gồm các tiện ích khác
nhau như file stream, hay file handle table... Đây là những thứ mà hệ
điều hành, bất kể Windows hay Linux, không thèm quan tâm. Ở đây chỉ
nói file handle table. msvcrt.dll quản lý file handle table theo cách
riêng. Mà *@&@#(!!)&! M$ ỷ thế người một nhà, Windows API mà còn có
"ưu ái" cho msvcrt.dll, trong STARTUPINFO struct. cygwin1.dll quản lý
file handle table cũng kiểu riêng. Thành ra không thể nào một ứng dụng
cùng lúc sử dụng cả msvcrt.dll và cygwin1.dll. Làm thế, biết sử dụng
open()
của cygwin, hay open()
của msvcrt?
Rồi, thành ra không thể nào gắn với cygwin1.dll được. Vậy mần sao xài
tc[gs]etattr()
? Cygwin mô phỏng môi trường Unix, ở đó có những tương
tác liên tiến trình, không thể lưu độc lập trong từng ứng dụng
được. Ví dụ như tty là "của chung" (ít nhất trên Linux, chỉ có cỡ mấy
chục tty trong /dev
thôi). Vậy nên phải có một vùng nhớ chung để
chia sẻ thông tin dạng này.
Sau một hồi mò vọc mà nguồn Cygwin, cuối cùng cũng tìm ra. Nó được gọi
là shared_info
trong Cygwin, một vùng nhớ động nằm ở
\NameBasedObjects\cygwin1S5\shared.5
(không hoàn toàn đúng như thế,
tuỳ phiên bản cygwin). Ở đấy có struct termios
, thông tin tty, được
thao tác bằng tc[sg]etattr()
. Vậy, mò vô đấy, sửa, thế là có thể
"liên lạc" được với rxvt.
Cái "phát kiến" này có thể được phát triển thêm thành một thư viện để nói chuyện với ứng dụng Cygwin từ những ứng dụng "phi Cygwin", với điều kiện đừng ai méc Cygwin developer. Chúng nó biết chúng nó quýnh chết!
Nói đi nói lại dài dòng. Túm lại là vi
chạy trên Windows! Ờ cần thêm
rxvt.exe và cygwin1.dll nữa. Tức! Cái busybox.exe có cỡ 300kb. Cộng
luôn rxvt.exe cũng chưa đến 500kb. Thế mà thằng cygwin1.dll một mình
nó hết gần 2.5mb. Chỉ muốn nhét thẳng rxvt vô busybox, làm terminal
riêng cho busybox. Để vi
chạy trên cmd.exe thì đường còn xa.
TB. Nhờ
WinObj
phát hiện ra thêm tty_list::mutex.0
. Vậy là có thể truy cập tty an
toàn được rồi. Trời, sao mình lại quay lại thọc ngoáy Windows internal
rồi?
Cập nhật 3 lần. Lần cuối: Tue Aug 08 11:22:15+0011 2017
Thứ bảy, 09 Tháng năm năm 2009 18:21:03 ICT
#Dia shape theming. That may solve Dia's ugly problem. Thinking..
Thứ bảy, 09 Tháng năm năm 2009 14:04:00 ICT
pushed out cygwin tty support for busybox-w32, but the size of cygwin1.dll makes me want to embed rxvt to busybox-w32 too.
Thứ sáu, 08 Tháng năm năm 2009 19:04:02 ICT
got access to cygwin termios data from non-cygwin app, time to have some fun
Thứ hai, 04 Tháng năm năm 2009 13:28:30 ICT
http://ur1.ca/3y0p #emacs for #maemo. Now I need another laptop to ssh to my little #n810 to type on it lolz
Thứ bảy, 02 Tháng năm năm 2009 14:50:02 ICT
took me a while to figure out where xterm was, so stock n810 is not completely useless as I thought
Thứ bảy, 02 Tháng năm năm 2009 12:36:46 ICT
got N810, more gadget in pocket, should drop something off, cellphone is always 1st candidate