GETGRENT(3)

名称
getgrent, getgrnam, getgrgid, setgroupent, setgrent, endgrent - グループデータベースの操作

書式
#include <sys/types.h> #include <grp.h> struct group * getgrent(void) struct group * getgrnam(const char *name) struct group * getgrgid(gid_t gid) int setgroupent(int stayopen) int setgrent(void) void endgrent(void)

解説
これらの関数はいずれも、 group(5) に記述されたグループデータベースファイル /etc/group を操作します。データベースの各行は、インクルードファイル <grp.h> にある構造体 group によって定義されます。次のとおりです。

    struct group {
    	char	*gr_name;	/* グループ名 */
    	char	*gr_passwd;	/* グループパスワード */
    	int	gr_gid;		/* グループ id */
    	char	**gr_mem;	/* グループメンバ */
    };

関数 getgrnam() および getgrgid() は、 name に示す与えられたグループ名または gid に示すグループ id を、グループデータベースで検索して、それぞれに最初の 適合エントリを返します。異なるエントリに同一グループ名または、同一グループ id が与えられていると、未定義な不測の挙動をもたらすことがあります。

getgrent() 関数は、グループデータベースを順次読み込みます。完全な グループリストを着実に生成するプログラム向きです。

3 つのルーチンはいずれも、読み込みに必要ならば目的のグループファイルを オープンします。

setgroupent() 関数は目的のファイルをオープン、またはすでにオープンされている 場合はリワインドします。 stayopen が 0 でなければ、ファイル記述子はオープン のままにされ、以後の関数呼び出しがきわめて高速化されます。ただし getgrent() の場合は、デフォルトでファイル記述子をクローズしないので、この 機能は不要です。また、グループファイルが更新される可能性があるので、 長期間実行するプログラムでこの機能を使用するのは危険です。注意してください。

setgrent() 関数は、0 の引数を持つ setgroupent() と同じです。

endgrent() 関数は、オープンされているファイルをクローズします。

YP/NIS の相互作用
yp(4) グループデータベースが使用可能な場合、要求されたグループがローカルの /etc/groupfile に見付からないと、 getgrnam() および getgrgid() 関数は、 YP マップ “group.byname” および “group.bygid” をそれぞれ使用します。 group(5) で記述されたとおりに全体マップが使用可能ならば、 getgrent() 関数は YP マップ “group.byname” を通ります。

戻り値
関数 getgrent(), getgrnam(), getgrgid() は、いずれも成功すると グループエントリのポインタを返します。エンドオブファイルに到達するかエラー が発生した場合は、ヌルポインタが返ります。関数 setgroupent() および setgrent() は、処理が無事に完了した場合は値 1 を返します。 その他の場合は値 0 が返ります。 関数 endgrent() および setgrfile() の戻り値はありません。

関連ファイル
/etc/group
    グループデータベースファイル

関連項目
getpwent(3), yp(4), group(5)

歴史
関数 endgrent(), getgrent(), getgrnam(), getgrgid(), setgrent() は、 AT&T UNIX で最初に取り入れられました。関数 setgrfile() および setgroupent() は、 4.3BSD Reno で最初に取り入れられました。

互換性
代替パスワードデータベースの規格を許した歴史的な関数 setgrfile() は、これまで非難されてきましたが、もはや使用できません。

バグ
関数 getgrent(), getgrnam(), getgrgid(), setgroupent(), setgrent() は、それぞれの結果を内部の静的オブジェクトに残し、そのオブジェクトの ポインタを返します。後に続く同じ関数の呼び出しは、その同じオブジェクトを 改変します。