金本と申します。

2008/06/19 10:18 Takahiro Kambe <taca / back-street.net>:
> こういう場合は、(あれば)getpwent_r()とかgetpwnam_r()を使った方が良いん
> じゃないかと思います。
ext/etc/etc.cをいじってgetpwent_rをつかうようにしても、
やっぱりループしてしまいました。
ためしに以下のようなコードでテストしてみたのですが、


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>
#include <unistd.h>
#define BUFLEN 4096
int
main()
{
  size_t sz = sysconf(_SC_GETPW_R_SIZE_MAX);
  char *buf;
  struct passwd pwd, *ppwd;
  struct passwd pw, *pwp;
  char buf2[BUFLEN];

  buf = (char*)calloc(sz,1);

  setpwent();
  getpwent_r(&pw, buf2, BUFLEN, &pwp); printf("%s\n", pw.pw_name);
  getpwent_r(&pw, buf2, BUFLEN, &pwp); printf("%s\n", pw.pw_name);

  getpwnam_r("nobody", &pwd, buf, sz, &ppwd);
  printf("user name: %s\n", ppwd->pw_name);

  getpwent_r(&pw, buf2, BUFLEN, &pwp); printf("%s\n", pw.pw_name);

  free(buf);
}

やはりファイルの頭に戻ってしまうようです。
% uname -a
Linux tatsumaki.battle.mil 2.6.25.6-55.fc9.x86_64 #1 SMP Tue Jun 10
16:05:21 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux

% head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

% ./a.out
root
bin
user name: nobody
root  <-daemonになってほしい

RHEL3とRHEL5でもそうなりました。
Redhat系だけネスとして呼べなくしたりするというのも
なんだかなぁ、というかどうしたらいいかよくわかりませんでした。
-- 
Yutaka KANEMOTO
http://d.hatena.ne.jp/kinpoco/