|
|
1.1 ! root 1: /* ! 2: * newgrp groupname ! 3: * this is exec'd by the shell ! 4: * to make it work: ! 5: * chmod u+s /bin/newgrp ! 6: */ ! 7: #include <stdio.h> ! 8: #include <grp.h> ! 9: ! 10: extern char **environ; ! 11: ! 12: main(argc,argv,envp) ! 13: char **argv,**envp; ! 14: { ! 15: register char *unam; ! 16: register int *flag; ! 17: register struct group *grp; ! 18: char *cp; ! 19: char *crypt(),*getpass(),*getlogin(); ! 20: int namect=0,inflg=0,outflg=0; ! 21: ! 22: environ=envp; ! 23: if (argc<2) ! 24: perrx("Usage: newgrp groupname"); ! 25: if ((grp=getgrnam(argv[1]))==NULL) ! 26: perrx("non-existent group"); ! 27: unam=getlogin(); ! 28: while (*grp->gr_mem!=NULL) { ! 29: if (**grp->gr_mem=='!') { ! 30: ++*grp->gr_mem; ! 31: flag=&outflg; ! 32: } else { ! 33: flag=&inflg; ! 34: ++namect; ! 35: } ! 36: if (strcmp(*grp->gr_mem,unam)==0) ! 37: ++*flag; ! 38: ++grp->gr_mem; ! 39: } ! 40: if (outflg) ! 41: perrx("access explicitly denied"); ! 42: if (!inflg && *grp->gr_passwd=='\0' && namect) ! 43: perrx("not in access list"); ! 44: if (!inflg && *grp->gr_passwd!='\0') { ! 45: if ((cp=getpass("Password:"))==NULL || *cp=='\0') ! 46: perrx("no"); ! 47: cp=crypt(cp,grp->gr_passwd); ! 48: if (strcmp(cp,grp->gr_passwd)!=0) ! 49: perrx("no"); ! 50: } ! 51: setgid(grp->gr_gid); ! 52: setuid(getuid()); ! 53: execle("/bin/sh","-",NULL,environ); ! 54: } ! 55: ! 56: perrx(s) ! 57: char *s; ! 58: { ! 59: fprintf(stderr,"%s\n",s); ! 60: setuid(getuid()); ! 61: execle("/bin/sh","-",NULL,environ); ! 62: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.