[Anthy-dev 565] Re: uim-xim and uim-helper-server problem on Mac OS X

Back to archive index

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*****




Anthy-dev メーリングリストの案内
Back to archive index