#include <sys/types.h> #include <grp.h> struct group *getgrnam(const char *name); struct group *getgrgid(gid_t gid); int getgrnam_r(const char *name, struct group *grp,
char *buf, size_t buflen, struct group **result); int getgrgid_r(gid_t gid, struct group *grp,
char *buf, size_t buflen, struct group **result);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
getgrnam_r(), getgrgid_r(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE || _POSIX_SOURCE
getgrgid() 関数は、グループ ID uid にマッチするグループ・データベースのエントリを 要素毎に分解し、各要素を格納した構造体へのポインタを返す。
getgrnam_r() と getgrgid_r() 関数は (上記の関数と) 同じ情報を取得するが、 取得した group 構造体を grp が指す領域に格納する。 この group 構造体には文字列へのポインタが含まれ、 これらの文字列はサイズ buflen のバッファ buf に格納される。 成功した場合 *gbufp には結果へのポインタが格納される。 エントリが見つからなかった場合やエラーが発生した場合には *result には NULL が入る。
group 構造体は、<grp.h> で以下のように定義されている:
struct group {
char *gr_name; /* グループ名 */
char *gr_passwd; /* グループのバスワード */
gid_t gr_gid; /* グループ ID */
char **gr_mem; /* グループのメンバ */
};
buf に最大必要なサイズは、 sysconf(3) に引き数 _SC_GETGR_R_SIZE_MAX を指定して実行することで分かる。
返り値は静的な領域を指しており、その後の getgrent(3), getgrgid(), getgrnam() の呼び出しで上書きされるかもしれない。 (返されたポインタを free(3) に渡さないこと。)
成功すると、 getgrnam_r() と getgrgid_r() は 0 を返し、 *result に grp を設定する。 マッチするグループ・エントリが見つからなかった場合には、 0 を返し、 *result に NULL を設定する。 エラーの場合、エラー番号を返し、 *result に NULL を設定する。