|
|
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.