aboutsummaryrefslogtreecommitdiff
path: root/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c')
-rw-r--r--contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c b/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
new file mode 100644
index 0000000..5679392
--- /dev/null
+++ b/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
@@ -0,0 +1,111 @@
+/*
+** Copyright 1998 - 2002 Double Precision, Inc. See COPYING for
+** distribution information.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <sys/types.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <grp.h>
+#include <pwd.h>
+#include <errno.h>
+
+#include "numlib.h"
+
+static const char rcsid[]="$Id: changeuidgid.c,v 1.2 2003/01/05 04:01:17 mrsam Exp $";
+
+void libmail_changegroup(gid_t gid)
+{
+ if ( setgid(gid))
+ {
+ perror("setgid");
+ exit(1);
+ }
+
+#if HAVE_SETGROUPS
+ if ( getuid() == 0 && setgroups(1, &gid) )
+ {
+ perror("setgroups");
+ exit(1);
+ }
+#endif
+}
+
+void libmail_changeuidgid(uid_t uid, gid_t gid)
+{
+ libmail_changegroup(gid);
+ if ( setuid(uid))
+ {
+ perror("setuid");
+ exit(1);
+ }
+}
+
+void libmail_changeusername(const char *uname, const gid_t *forcegrp)
+{
+struct passwd *pw;
+uid_t changeuid;
+gid_t changegid;
+
+/* uname might be a pointer returned from a previous called to getpw(),
+** and libc has a problem getting it back.
+*/
+char *p=malloc(strlen(uname)+1);
+
+ if (!p)
+ {
+ perror("malloc");
+ exit(1);
+ }
+ strcpy(p, uname);
+
+ errno=ENOENT;
+ if ((pw=getpwnam(p)) == 0)
+ {
+ free(p);
+ perror("getpwnam");
+ exit(1);
+ }
+ free(p);
+
+ changeuid=pw->pw_uid;
+
+ if ( !forcegrp ) forcegrp= &pw->pw_gid;
+
+ changegid= *forcegrp;
+
+ if ( setgid( changegid ))
+ {
+ perror("setgid");
+ exit(1);
+ }
+
+#if HAVE_INITGROUPS
+ if ( getuid() == 0 && initgroups(pw->pw_name, changegid) )
+ {
+ perror("initgroups");
+ exit(1);
+ }
+#else
+#if HAVE_SETGROUPS
+ if ( getuid() == 0 && setgroups(1, &changegid) )
+ {
+ perror("setgroups");
+ exit(1);
+ }
+#endif
+#endif
+
+ if (setuid(changeuid))
+ {
+ perror("setuid");
+ exit(1);
+ }
+}