/* $Id: suex.c,v 1.2 1994/02/07 04:48:33 jaw Exp jaw $ portions adapted from BSD su */ #include #include #include #include #include #include #include #include #include #define SUPER_GROUP_NAME "super-users" char *mytty(void); main(int argc, char **argv){ int retcode; char string[260]; int gids[NGROUPS_MAX],gidval; int i=0,uid, super_gid; struct passwd *pwd; struct group *grp; char *username; if ((pwd=getpwuid(uid = getuid()))==NULL){ /* you have no entry in pw file */ fprintf(stderr, "suex: who are you\n"); exit(-1); } if ( (grp=getgrnam(SUPER_GROUP_NAME))==NULL){ /* no super user group in group file */ fprintf(stderr, "suex: super user group non-existant\n"); exit(-1); } username = strdup(pwd->pw_name); openlog("suex:", LOG_PID|LOG_CONS, LOG_AUTH); /* tell syslog all about it */ gidval = getgroups(NGROUPS_MAX, gids); /* check if in group super-user */ while ( (i<=gidval)&&(gids[i] != grp->gr_gid) ) i++; if ( gids[i] != grp->gr_gid ){ syslog(LOG_AUTH|LOG_NOTICE, "suex failed for %s (%d) on %s", username, uid, mytty()); fprintf(stderr,"You are not authorized to use this command\nSorry!\n"); exit(-1); } setuid( geteuid() ); /* become root */ setgid( getegid() ); /* become daemon group */ syslog(LOG_AUTH|LOG_INFO, "suex succeded for %s (%d) on %s", username, uid, mytty()); if (argc >1 ){ execvp( argv[1], &argv[1] ); fprintf(stderr, "%s: %s failed\r\n",argv[0],argv[1]); exit(-1); }else{ printf("%s: exec. what?: ",argv[0]); fflush(stdout); retcode=system( gets(string) ); if (retcode ) fprintf(stderr,"%s: %s failed with error %d\r\n",argv[0],string,retcode); exit(retcode); } } char *mytty(void){ char *p; return((p=ttyname(STDERR_FILENO))?p:"Unknown tty"); }