summaryrefslogtreecommitdiffstats
path: root/src/test.c
blob: 092d7f3a700d3cf3c952a1fff33e977eb86ba6b8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <sys/types.h>
#include <errno.h>
#include <nss.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
	char *buf;
	size_t size = 2;
	int result;
	struct passwd passwd, *pwd = NULL;

	__nss_configure_lookup ("passwd", "directories");

	buf = malloc(size);
	setpwent();
	do {
		pwd = NULL;
		result = getpwent_r(&passwd, buf, size, &pwd);
		printf("%d: ", result);
		switch (result) {
		case 0:
			printf("%s\n", pwd->pw_name);
			break;
		case ERANGE:
			printf("%d is not enough, error = %s\n", size,
			       strerror(errno));
			size++;
			free(buf);
			buf = malloc(size);
			result = 0;
			break;
		default:
			printf("failed (%s)\n", strerror(result));
			_exit(1);
			break;
		}
	} while (result == 0);
	endpwent();
	return 0;
}