Etsushi Kato
ekato****@ees*****
2004年 2月 17日 (火) 13:52:03 JST
加藤です。こんにちは。 On 2004/02/16, at 9:44 PM, yusuk****@cheru***** wrote: >> についてですが、どうも Mac OS X の fstat(2) は socket に対して st_uid >> などが使えないというバグがあるようです。man page には、 > <略> >> のみ使える情報が存在していました… 困ったものです。ということで、descriptor に対してではなく、socket のパスそのものの >> st_uid を確認するほうが、ポータブルなのかもしれません。 > 自分および他の開発者へのメモ的に突っ込んでおきます。 > #Katoさんを批判する気はまったくありませんので、御理解をお願いします。 プログラミングについてはまったくの素人なので、御指摘ありがたいです。 ただ使ってはいないのですが、NetBSD と OpenBSD も Mac OS X と同様に、 socket の fd に対する fstat(2) の st_uid は 0 になってしまうように みえるので (試していません。まちがっていたら御指摘ください)、ここの変更は 必用かなと思って上のように書いたところです。 > 「2004年ごろのMacOS X」対策ですとコメントを書いた上で、 > if (fst.st_uid != getuid()) { > if (何か敗者復活条件) { > } else { > close(fd); > return -1; > } > } > みたいに他のOSでのフローが変わらないようなコードが > できれば、取り込みたいと思います。 > #owner以外は読めないはずなのにconnectできてるとか > #他のOSなら有り得ない状況?このチェックにraceはあり? ぜひぜひおねがいします。 あと、先程また uim-xim で気付いた点なのですが、endian の異なるホストの クライアント上では入力がおかしくなるようです。以下の用に変更したところ この点は解決できました (とりあえず動いた、というだけです。byte swap の部分はもっと上手く書いて頂けたらと思います)。 --- ximtrans.cpp.orig Sat Dec 20 23:35:19 2003 +++ ximtrans.cpp Tue Feb 17 13:43:29 2004 @@ -356,7 +356,10 @@ } unsigned char *v; v = (unsigned char *)&s; - s = (v[0]<<8) + v[1]; + if (host_byte_order == LSB_FIRST) + s = (v[0]<<8) + v[1]; + else + s = (v[1]<<8) + v[0]; return s; } @@ -365,6 +368,12 @@ if (host_byte_order == mByteorder) { return l; } + unsigned char *v; + v = (unsigned char *)&l; + if (host_byte_order == LSB_FIRST) + l = (v[0]<<24) + (v[1]<<16) + (v[2]<<8)+ v[3]; + else + l = (v[3]<<24) + (v[2]<<16) + (v[1]<<8)+ v[0]; return l; } また、他のホストでクライアントを動かすと、"try to get unknown ic attribute 0." や、"try to get unknown ic attribute 14." のエラーが出るようです。これは endian は関係ありません。 0 の ICA_InputStyle については以下のように適当に変更しました。 --- ximic.cpp.orig Sat Jan 10 13:31:51 2004 +++ ximic.cpp Tue Feb 17 13:36:24 2004 @@ -275,6 +275,8 @@ return 4; case ICA_FilterEvents: return 4; + case ICA_InputStyle: + return 4; } return 0; } @@ -462,6 +464,9 @@ break; case ICA_FilterEvents: t->pushC32(KeyPressMask); + break; + case ICA_InputStyle: + t->pushC32(m_xatr.input_style); break; default: printf("try to get unknown ic attribute %d.\n",id); -- Etsushi Kato ekato****@ees*****