]> git.notmuchmail.org Git - notmuch/blobdiff - contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
Move files copied from maildrop to a separate hierarchy.
[notmuch] / contrib / notmuch-deliver / maildrop / numlib / changeuidgid.c
diff --git a/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c b/contrib/notmuch-deliver/maildrop/numlib/changeuidgid.c
new file mode 100644 (file)
index 0000000..5679392
--- /dev/null
@@ -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);
+       }
+}