金本と申します。
もうどなたかご対応されているかもしれませんが、
気づいたので報告させていただきます。
手元の環境でtest/etc/test_etc.rbのtest_getpwnumがループします。
def test_getpwnam
Etc.passwd do |s|
assert_equal(s, Etc.getpwnam(s.name))
end
end
これが原因でtest-allがすすみません。
こんな感じで再現できます。
% ruby -v -retc -e 'Etc.passwd do |s| p Etc.getpwnam("root"); end'
ruby 1.9.0 (2008-06-18 revision 17419) [x86_64-linux]
#<struct Struct::Passwd name="root", passwd="x", uid=0, gid=0,
gecos="root", dir="/root", shell="/bin/bash">
#<struct Struct::Passwd name="root", passwd="x", uid=0, gid=0,
gecos="root", dir="/root", shell="/bin/bash">
#<struct Struct::Passwd name="root", passwd="x", uid=0, gid=0,
gecos="root", dir="/root", shell="/bin/bash">
(以下略)
ちなみに1.8でもループしました。
ためしに以下のようなプログラムを書くと分かるのですが、
#include <stdio.h>
#include <sys/types.h>
#include <pwd.h>
int
main()
{
struct passwd *pw;
setpwent();
pw = getpwent();
printf("%s\n", pw->pw_name);
pw = getpwent();
printf("%s\n", pw->pw_name);
pw = getpwnam("root");
printf("%s\n", pw->pw_name);
pw = getpwent();
printf("%s\n", pw->pw_name);
endpwent();
return 0;
}
実行結果
% ./a.out
root
bin
root
root
つまり、setpwent()とendpwent()で回している間に、getpwnam()をすると、
ポインタがその人のところに戻ってしまうようです。
中で呼んではいけないということだと思い、
ext/etc/etc.cでpasswd_blockingでのチェックを
etc_getpwnam()にいれた上でテストの仕方を変える方がいいのかなとも思ったのですが、
どうするべきかよくわからなかったので報告だけですみません。
よろしくお願いいたします。
--
Yutaka KANEMOTO
http://d.hatena.ne.jp/kinpoco/