#include <netdb.h> int setnetgrent(const char *netgroup); void endnetgrent(void); int getnetgrent(char **host, char **user, char **domain); int getnetgrent_r(char **host, char **user, char **domain, char *buf, size_t buflen); int innetgr(const char *netgroup, const char *host, const char *user, const char *domain);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
setnetgrent(),
endnetgrent(),
getnetgrent(),
getnetgrent_r(),
innetgr():
glibc 2.19 以降:
_DEFAULT_SOURCE
glibc 2.19 以前:
_BSD_SOURCE || _SVID_SOURCE
setnetgrent() コールは、この後で呼ばれる getnetgrent() コールが検索するネットグループを定める。 getnetgrent() 関数はネットグループの次のエントリーを取得し、 host, user, domain にポインターを入れて返る。ヌルポインターは、対応するエントリーがどんな文字列とも一致することを意味する。 得られたポインターは、ネットグループ関係の関数のいずれかが呼ばれるまでの 間だけ有効である。この問題を避けるためには GNU 拡張の関数 getnetgrent_r() を使うとよい。この関数は呼び出し側が用意したバッファーに 文字列を格納する。割り当て済のバッファーを全て解放するには endnetgrent() を使用する。
ほとんどの場合、 (hostname, username, domainname) の3要素の組がネットグループのメンバーかどうかを確認したいだけであろう。 innetgr() 関数を使うと、上記の3つの関数を呼び出さずにこの目的を達成できる。 もう一度書いておくが、NULL ポインターはワイルドカードであり、 あらゆる文字列と一致する。この関数はスレッドセーフである。
Interface | Attribute | Value |
setnetgrent(),
getnetgrent_r(), innetgr() | Thread safety |
MT-Unsafe race:netgrent
locale |
endnetgrent() | Thread safety | MT-Unsafe race:netgrent |
getnetgrent() | Thread safety |
MT-Unsafe race:netgrent
race:netgrentbuf locale |
In the above table, netgrent in race:netgrent signifies that if any of the functions setnetgrent(), getnetgrent_r(), innetgr(), getnetgrent(), or endnetgrent() are used in parallel in different threads of a program, then data races could occur.