1/* this tests whether getgroups actually returns lists of integers
2   rather than gid_t. The test only works if the user running
3   the test is in at least 1 group
4
5   The test is designed to check for those broken OSes that define
6   getgroups() as returning an array of gid_t but actually return a
7   array of ints! Ultrix is one culprit
8  */
9
10#if defined(HAVE_UNISTD_H)
11#include <unistd.h>
12#endif
13
14#include <sys/types.h>
15#include <stdio.h>
16#include <unistd.h>
17#include <grp.h>
18
19main()
20{
21	int i;
22	int *igroups;
23	char *cgroups;
24	int grp = 0;
25	int  ngroups = getgroups(0,&grp);
26
27	if (sizeof(gid_t) == sizeof(int)) {
28		fprintf(stderr,"gid_t and int are the same size\n");
29		exit(1);
30	}
31
32	if (ngroups <= 0)
33		ngroups = 32;
34
35	igroups = (int *)malloc(sizeof(int)*ngroups);
36
37	for (i=0;i<ngroups;i++)
38		igroups[i] = 0x42424242;
39
40	ngroups = getgroups(ngroups,(gid_t *)igroups);
41
42	if (igroups[0] == 0x42424242)
43		ngroups = 0;
44
45	if (ngroups == 0) {
46		printf("WARNING: can't determine getgroups return type\n");
47		exit(1);
48	}
49
50	cgroups = (char *)igroups;
51
52	if (ngroups == 1 &&
53	    cgroups[2] == 0x42 && cgroups[3] == 0x42) {
54		fprintf(stderr,"getgroups returns gid_t\n");
55		exit(1);
56	}
57
58	for (i=0;i<ngroups;i++) {
59		if (igroups[i] == 0x42424242) {
60			fprintf(stderr,"getgroups returns gid_t\n");
61			exit(1);
62		}
63	}
64
65	exit(0);
66}
67