Commit | Line | Data |
---|---|---|
3b600ead TL |
1 | #include <stdio.h> |
2 | #include <grp.h> | |
3 | #include <pwd.h> | |
4 | ||
5 | struct group *getgrnam(), *grp; | |
6 | struct passwd *getpwuid(), *pwd; | |
7 | char *getpass(), *crypt(); | |
8 | ||
9 | main(argc,argv) | |
10 | int argc; | |
11 | char **argv; | |
12 | { | |
13 | register i; | |
14 | if(argc != 2) { | |
15 | printf("usage: newgrp groupname\n"); | |
16 | done(); | |
17 | } | |
18 | if((grp=getgrnam(argv[1])) == NULL) { | |
19 | printf("%s: no such group\n", argv[1]); | |
20 | done(); | |
21 | } | |
22 | if((pwd=getpwuid(getuid())) == NULL) { | |
23 | printf("You do not exist!\n"); | |
24 | done(); | |
25 | } | |
26 | for(i=0;grp->gr_mem[i];i++) | |
27 | if(strcmp(grp->gr_mem[i], pwd->pw_name) == 0) | |
28 | break; | |
29 | if(grp->gr_mem[i] == 0 && strcmp(grp->gr_name,"other")) { | |
30 | printf("Sorry\n"); | |
31 | done(); | |
32 | } | |
33 | ||
34 | if(grp->gr_passwd[0] != '\0' && pwd->pw_passwd[0] == '\0') { | |
35 | if(strcmp(grp->gr_passwd, crypt(getpass("Password:"),grp->gr_passwd)) != 0) { | |
36 | printf("Sorry\n"); | |
37 | done(); | |
38 | } | |
39 | } | |
40 | if(setgid(grp->gr_gid) < 0) | |
41 | perror("setgid"); | |
42 | done(); | |
43 | } | |
44 | ||
45 | done() | |
46 | { | |
47 | register i; | |
48 | ||
49 | setuid(getuid()); | |
50 | for (i=3; i<15; i++) | |
51 | close(i); | |
52 | execl("/bin/sh", "sh", 0); | |
53 | printf("No shell!\n"); | |
54 | exit(0); | |
55 | } |