]> rtime.felk.cvut.cz Git - notmuch.git/blob - contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
emacs: Washing should use more `defcustom'.
[notmuch.git] / contrib / notmuch-deliver / maildrop / numlib / changeuidgid.c
1 /*
2 ** Copyright 1998 - 2002 Double Precision, Inc.  See COPYING for
3 ** distribution information.
4 */
5
6 #if     HAVE_CONFIG_H
7 #include        "config.h"
8 #endif
9 #include        <sys/types.h>
10 #if     HAVE_UNISTD_H
11 #include        <unistd.h>
12 #endif
13 #include        <stdio.h>
14 #include        <stdlib.h>
15 #include        <string.h>
16 #include        <grp.h>
17 #include        <pwd.h>
18 #include        <errno.h>
19
20 #include        "numlib.h"
21
22
23 void libmail_changegroup(gid_t gid)
24 {
25         if ( setgid(gid))
26         {
27                 perror("setgid");
28                 exit(1);
29         }
30
31 #if HAVE_SETGROUPS
32         if ( getuid() == 0 && setgroups(1, &gid) )
33         {
34                 perror("setgroups");
35                 exit(1);
36         }
37 #endif
38 }
39
40 void libmail_changeuidgid(uid_t uid, gid_t gid)
41 {
42         libmail_changegroup(gid);
43         if ( setuid(uid))
44         {
45                 perror("setuid");
46                 exit(1);
47         }
48 }
49
50 void libmail_changeusername(const char *uname, const gid_t *forcegrp)
51 {
52 struct passwd *pw;
53 uid_t   changeuid;
54 gid_t   changegid;
55
56 /* uname might be a pointer returned from a previous called to getpw(),
57 ** and libc has a problem getting it back.
58 */
59 char    *p=malloc(strlen(uname)+1);
60
61         if (!p)
62         {
63                 perror("malloc");
64                 exit(1);
65         }
66         strcpy(p, uname);
67
68         errno=ENOENT;
69         if ((pw=getpwnam(p)) == 0)
70         {
71                 free(p);
72                 perror("getpwnam");
73                 exit(1);
74         }
75         free(p);
76
77         changeuid=pw->pw_uid;
78
79         if ( !forcegrp )        forcegrp= &pw->pw_gid;
80
81         changegid= *forcegrp;
82
83         if ( setgid( changegid ))
84         {
85                 perror("setgid");
86                 exit(1);
87         }
88
89 #if HAVE_INITGROUPS
90         if ( getuid() == 0 && initgroups(pw->pw_name, changegid) )
91         {
92                 perror("initgroups");
93                 exit(1);
94         }
95 #else
96 #if HAVE_SETGROUPS
97         if ( getuid() == 0 && setgroups(1, &changegid) )
98         {
99                 perror("setgroups");
100                 exit(1);
101         }
102 #endif
103 #endif
104
105         if (setuid(changeuid))
106         {
107                 perror("setuid");
108                 exit(1);
109         }
110 }