Back to index

courier  0.68.2
changeuidgid.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2002 Double Precision, Inc.  See COPYING for
00003 ** distribution information.
00004 */
00005 
00006 #if    HAVE_CONFIG_H
00007 #include      "config.h"
00008 #endif
00009 #include      <sys/types.h>
00010 #if    HAVE_UNISTD_H
00011 #include      <unistd.h>
00012 #endif
00013 #include      <stdio.h>
00014 #include      <stdlib.h>
00015 #include      <string.h>
00016 #include      <grp.h>
00017 #include      <pwd.h>
00018 #include      <errno.h>
00019 
00020 #include      "numlib.h"
00021 
00022 
00023 void libmail_changegroup(gid_t gid)
00024 {
00025        if ( setgid(gid))
00026        {
00027               perror("setgid");
00028               exit(1);
00029        }
00030 
00031 #if HAVE_SETGROUPS
00032        if ( getuid() == 0 && setgroups(1, &gid) )
00033        {
00034               perror("setgroups");
00035               exit(1);
00036        }
00037 #endif
00038 }
00039 
00040 void libmail_changeuidgid(uid_t uid, gid_t gid)
00041 {
00042        libmail_changegroup(gid);
00043        if ( setuid(uid))
00044        {
00045               perror("setuid");
00046               exit(1);
00047        }
00048 }
00049 
00050 void libmail_changeusername(const char *uname, const gid_t *forcegrp)
00051 {
00052 struct passwd *pw;
00053 uid_t  changeuid;
00054 gid_t  changegid;
00055 
00056 /* uname might be a pointer returned from a previous called to getpw(),
00057 ** and libc has a problem getting it back.
00058 */
00059 char   *p=malloc(strlen(uname)+1);
00060 
00061        if (!p)
00062        {
00063               perror("malloc");
00064               exit(1);
00065        }
00066        strcpy(p, uname);
00067 
00068        errno=ENOENT;
00069        if ((pw=getpwnam(p)) == 0)
00070        {
00071               free(p);
00072               perror("getpwnam");
00073               exit(1);
00074        }
00075        free(p);
00076 
00077        changeuid=pw->pw_uid;
00078 
00079        if ( !forcegrp )     forcegrp= &pw->pw_gid;
00080 
00081        changegid= *forcegrp;
00082 
00083        if ( setgid( changegid ))
00084        {
00085               perror("setgid");
00086               exit(1);
00087        }
00088 
00089 #if HAVE_INITGROUPS
00090        if ( getuid() == 0 && initgroups(pw->pw_name, changegid) )
00091        {
00092               perror("initgroups");
00093               exit(1);
00094        }
00095 #else
00096 #if HAVE_SETGROUPS
00097        if ( getuid() == 0 && setgroups(1, &changegid) )
00098        {
00099               perror("setgroups");
00100               exit(1);
00101        }
00102 #endif
00103 #endif
00104 
00105        if (setuid(changeuid))
00106        {
00107               perror("setuid");
00108               exit(1);
00109        }
00110 }