Content-type: text/html; charset=UTF-8
#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);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
setnetgrent(),
endnetgrent(),
getnetgrent(),
getnetgrent_r(),
innetgr():
Since glibc 2.19:
_DEFAULT_SOURCE
Glibc 2.19 and earlier:
_BSD_SOURCE || _SVID_SOURCE
The setnetgrent() call defines the netgroup that will be searched by subsequent getnetgrent() calls. The getnetgrent() function retrieves the next netgroup entry, and returns pointers in host, user, domain. A null pointer means that the corresponding entry matches any string. The pointers are valid only as long as there is no call to other netgroup-related functions. To avoid this problem you can use the GNU function getnetgrent_r() that stores the strings in the supplied buffer. To free all allocated buffers use endnetgrent().
In most cases you want to check only if the triplet (hostname, username, domainname) is a member of a netgroup. The function innetgr() can be used for this without calling the above three functions. Again, a null pointer is a wildcard and matches any string. The function is thread-safe.
| 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.