#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():
getgrgid() 関数は、グループ ID uid にマッチするグループデータベースのエントリーを 要素毎に分解し、各要素を格納した構造体へのポインターを返す。
group 構造体は <grp.h> で以下のように定義されている:
struct group {
char *gr_name; /* グループ名 */
char *gr_passwd; /* グループのパスワード */
gid_t gr_gid; /* グループ ID */
char **gr_mem; /* グループのメンバ名へのポインター
の配列 (配列はヌルで終端する) */
};
この構造体のフィールドの詳細は group(5) を参照のこと。
getgrnam_r() と getgrgid_r() 関数は、それぞれ getgrnam() と getgrgid() と同じ情報を取得するが、取得した group 構造体を grp が指す領域に格納する。group 構造体のメンバーが指す文字列は、 サイズ buflen のバッファー buf に格納される。成功した場合 *gbufp には結果へのポインターが格納される。エントリーが見つからなかった 場合やエラーが発生した場合には *result には NULL が入る。
呼び出し
sysconf(_SC_GETGR_R_SIZE_MAX)
は、 errno を変更せずに -1 を返すか、 buf の初期サイズの推奨値を 返す。(このサイズが小さすぎる場合、呼び出しは ERANGE で失敗し、この 場合には呼び出し側はバッファーを大きくしてから再度呼び出すことができる。)
返り値は静的な領域を指しており、その後の getgrent(3), getgrgid(), getgrnam() の呼び出しで上書きされるかもしれない。 (返されたポインターを free(3) に渡さないこと。)
成功すると、 getgrnam_r() と getgrgid_r() は 0 を返し、 *result に grp を設定する。 マッチするグループエントリーが見つからなかった場合には、 0 を返し、 *result に NULL を設定する。 エラーの場合、エラー番号を返し、 *result に NULL を設定する。
インターフェース | 属性 | 値 |
getgrnam() | Thread safety | MT-Unsafe race:grnam locale |
getgrgid() | Thread safety | MT-Unsafe race:grgid locale |
getgrnam_r(),
getgrgid_r() | Thread safety | MT-Safe locale |