diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-07-29 05:05:36 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-07-29 05:05:36 +0000 |
commit | fb08c34cf3950f994701a9c98c89670f6346f7ab (patch) | |
tree | d24bacbacb7c84d89c52c2e7742a4fe4bea537b2 /source3/tests/getgroups.c | |
parent | 73dc9870af658dfe467e33ecefe2d740a0d0dbb0 (diff) | |
download | samba-fb08c34cf3950f994701a9c98c89670f6346f7ab.tar.gz samba-fb08c34cf3950f994701a9c98c89670f6346f7ab.tar.xz samba-fb08c34cf3950f994701a9c98c89670f6346f7ab.zip |
get rid of the runtime test for broken getgroups() and add a compile
time test instead. This also allows us to get rid of the igroups
element of a couple of structures.
(This used to be commit 8b25fe734166b76ceebf8d9543c706ebe0fddc96)
Diffstat (limited to 'source3/tests/getgroups.c')
-rw-r--r-- | source3/tests/getgroups.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/source3/tests/getgroups.c b/source3/tests/getgroups.c new file mode 100644 index 00000000000..37990e010b8 --- /dev/null +++ b/source3/tests/getgroups.c @@ -0,0 +1,62 @@ +/* this tests whether getgroups actually returns lists of integers + rather than gid_t. The test only works if the user running + the test is in at least 1 group + + The test is designed to check for those broken OSes that define + getgroups() as returning an array of gid_t but actually return a + array of ints! Ultrix is one culprit + */ + +#include <sys/types.h> +#include <stdio.h> +#include <unistd.h> +#include <grp.h> + +main() +{ + int i; + int *igroups; + char *cgroups; + int grp = 0; + int ngroups = getgroups(0,&grp); + + if (sizeof(gid_t) == sizeof(int)) { + fprintf(stderr,"gid_t and int are the same size\n"); + exit(1); + } + + if (ngroups <= 0) + ngroups = 32; + + igroups = (int *)malloc(sizeof(int)*ngroups); + + for (i=0;i<ngroups;i++) + igroups[i] = 0x42424242; + + ngroups = getgroups(ngroups,(gid_t *)igroups); + + if (igroups[0] == 0x42424242) + ngroups = 0; + + if (ngroups == 0) { + printf("WARNING: can't determine getgroups return type\n"); + exit(1); + } + + cgroups = (char *)igroups; + + if (ngroups == 1 && + cgroups[2] == 0x42 && cgroups[3] == 0x42) { + fprintf(stderr,"getgroups returns gid_t\n"); + exit(1); + } + + for (i=0;i<ngroups;i++) { + if (igroups[i] == 0x42424242) { + fprintf(stderr,"getgroups returns gid_t\n"); + exit(1); + } + } + + exit(0); +} |