summaryrefslogtreecommitdiffstats
path: root/source3/tests/getgroups.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1998-07-29 05:05:36 +0000
committerAndrew Tridgell <tridge@samba.org>1998-07-29 05:05:36 +0000
commitfb08c34cf3950f994701a9c98c89670f6346f7ab (patch)
treed24bacbacb7c84d89c52c2e7742a4fe4bea537b2 /source3/tests/getgroups.c
parent73dc9870af658dfe467e33ecefe2d740a0d0dbb0 (diff)
downloadsamba-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.c62
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);
+}