From: YOKOYAMA Takehiro Date: 2003-07-21T11:37:45+09:00 Subject: [ruby-list:37912] Re: control user ID / group ID 実ユーザー/グループID、実効ユーザー/グループIDを操作するシステムコールは、 似た名前のものがたくさんあるし、実際に相手にしているOSでは 書籍の説明どおりに動かなかったりして苦労が多いので、 今回の試みは意義のあることだと思います。 実装方法に関して、私が普段使っているBSD/OSの場合の事情ですが、 次のような考慮事項があります。 何のパラメーターもつけずに ./configure すると #define HAVE_SETREUID 1 となるので、setreuid/setregidを使った実装になるのですが、 実際にはsetuid/seteuid / setgid/setegidを使わないと正常に IDが切り替わらない場合があります。 この点に気づいたのは、samba-2.2.Xをアップデートしようとしていたときでした。 グループID(wheelとnogroup)を切り替えるためにsetregidを呼び出しているのですが、 実際には切り替わらないのです。 man setregidしてみると、次のような記述があります。 The setregid() function was intended to allow swapping the real and effective group IDs in set-group-ID programs to temporarily relinquish the set-group-ID value. This function did not work correctly, and its purpose is now better served by the use of the setegid() function (see setuid(2)). ということで、setgid/setegidで切り替えるようにしてみたところ、 うまく動作しています。 ちなみに、sambaのこの変更パッチを投稿したところ、Mac OS X 10.2でも 同様の問題があり、パッチ適用によりうまく動作するようになったという 通知がありました。 なお、 #elif defined HAVE_SETRGID && defined HAVE_SETEGID のときsetrgid/setegidを使っているようですが、そうではなくsetgid/setegidです。 man setrgidには次のような記述があります。 The use of these calls is not portable. Their use is discouraged; they will be removed in the future. -- 横山岳浩 tac@amris.co.jp