Import sendmail 8.13.6
[dragonfly.git] / contrib / sendmail-8.13.6 / test / t_setgid.c
1 /*
2  * Copyright (c) 2001 Sendmail, Inc. and its suppliers.
3  *      All rights reserved.
4  *
5  * By using this file, you agree to the terms and conditions set
6  * forth in the LICENSE file which can be found at the top level of
7  * the sendmail distribution.
8  *
9  */
10
11 /*
12 **  This program checks to see if your version of setgid works.
13 **  Compile it, make it set-group-ID guest, and run it as yourself (NOT as
14 **  root and not as member of the group guest).
15 **
16 **  Compilation is trivial -- just "cc t_setgid.c".  Make it set-group-ID,
17 **  guest and then execute it as a non-root user.
18 */
19
20 #include <sys/types.h>
21 #include <unistd.h>
22 #include <stdio.h>
23
24 #ifndef lint
25 static char id[] = "@(#)$Id: t_setgid.c,v 1.6 2001/09/23 03:35:41 ca Exp $";
26 #endif /* ! lint */
27
28 static void
29 printgids(str, r, e)
30         char *str;
31         gid_t r, e;
32 {
33         printf("%s (should be %d/%d): r/egid=%d/%d\n", str, (int) r, (int) e,
34                (int) getgid(), (int) getegid());
35 }
36
37 int
38 main(argc, argv)
39         int argc;
40         char **argv;
41 {
42         int fail = 0;
43         int res;
44         gid_t realgid = getgid();
45         gid_t effgid = getegid();
46
47         printgids("initial gids", realgid, effgid);
48
49         if (effgid == realgid)
50         {
51                 printf("SETUP ERROR: re-run set-group-ID guest\n");
52                 exit(1);
53         }
54
55 #if SM_CONF_SETREGID
56         res = setregid(effgid, effgid);
57 #else /* SM_CONF_SETREGID */
58         res = setgid(effgid);
59 #endif /* SM_CONF_SETREGID */
60
61         printf("setgid(%d)=%d %s\n", (int) effgid, res,
62                 res < 0 ? "failure" : "ok");
63 #if SM_CONF_SETREGID
64         printgids("after setregid()", effgid, effgid);
65 #else /* SM_CONF_SETREGID */
66         printgids("after setgid()", effgid, effgid);
67 #endif /* SM_CONF_SETREGID */
68
69         if (getegid() != effgid)
70         {
71                 fail++;
72                 printf("MAYDAY!  Wrong effective gid\n");
73         }
74
75         if (getgid() != effgid)
76         {
77                 fail++;
78                 printf("MAYDAY!  Wrong real gid\n");
79         }
80
81         /* do activity here */
82         if (setgid(0) == 0)
83         {
84                 fail++;
85                 printf("MAYDAY!  setgid(0) succeeded (should have failed)\n");
86         }
87         else
88         {
89                 printf("setgid(0) failed (this is correct)\n");
90         }
91         printgids("after setgid(0)", effgid, effgid);
92
93         if (getegid() != effgid)
94         {
95                 fail++;
96                 printf("MAYDAY!  Wrong effective gid\n");
97         }
98         if (getgid() != effgid)
99         {
100                 fail++;
101                 printf("MAYDAY!  Wrong real gid\n");
102         }
103         printf("\n");
104
105         if (fail > 0)
106         {
107                 printf("\nThis system cannot use %s to set the real gid to the effective gid\nand clear the saved gid.\n",
108 #if SM_CONF_SETREGID
109                         "setregid"
110 #else /* SM_CONF_SETREGID */
111                         "setgid"
112 #endif /* SM_CONF_SETREGID */
113                         );
114                 exit(1);
115         }
116
117         printf("\nIt is possible to use setgid on this system\n");
118         exit(0);
119 }