home *** CD-ROM | disk | FTP | other *** search
- int gbuf[259];
- int pbuf[259];
- int ttyb[3];
- char name[10];
- char passwd[10];
- char space[1000];
- int peek;
- int pwdflg;
-
- main(argc, argv)
- char *argv[];
- {
- register id;
- register char *p, *q;
-
- if(argc < 2) {
- printf("usage: newgrp groupname\n");
- done();
- }
- if(fopen("/etc/group", gbuf) < 0) {
- printf("cannot open group file\n");
- done();
- }
- do {
- field(name, gbuf);
- p = name;
- q = argv[1];
- while(*p == *q++)
- if(*p++ == 0 || p >= name+8)
- goto l1;
- } while(skip(gbuf));
- printf("%s: not a valid group name\n", argv[1]);
- done();
-
- l1:
- if(fopen("/etc/passwd", pbuf) < 0) {
- printf("cannot open password file\n");
- done();
- }
- p = space;
- id = getuid() & 0377;
- do {
- field(p, pbuf);
- field(name, pbuf);
- if(value(pbuf) == id) {
- if(name[0] == 0)
- pwdflg++;
- while(*p++) ;
- }
- } while(skip(pbuf));
- *p = 0;
-
- field(passwd, gbuf);
- id = value(gbuf);
- if(id == 1) {
- pwdflg = 0;
- goto l2;
- }
- do {
- p = space;
- field(name, gbuf);
- while(*p) {
- q = name;
- while(*p == *q++) {
- if(*p++ == 0)
- goto l2;
- }
- while(*p++) ;
- }
- } while(peek == ',');
- goto no;
-
- l2:
- if(pwdflg && passwd[0]) {
- printf("password: ");
- gtty(0, pbuf);
- pbuf[3] = pbuf[2];
- pbuf[2] =& ~010;
- stty(0, pbuf);
- read(0, gbuf, 512);
- pbuf[2] = pbuf[3];
- stty(0, pbuf);
- printf("\n");
- p = name;
- q = gbuf;
- while(p < name+8) {
- if(*q == '\n')
- break;
- *p++ = *q++;
- }
- *p = 0;
- p = crypt(name);
- q = passwd;
- while(q < passwd+8)
- if(*p++ != *q++)
- goto no;
- }
- if(setgid(id) < 0) {
- perror("setgid");
- goto no;
- }
- done();
-
- no:
- printf("Sorry\n");
- done();
- }
-
- skip(buf)
- {
-
- while(peek > 0) {
- if(peek == '\n') {
- peek = 1;
- return(1);
- }
- peek = getc(buf);
- }
- return(0);
- }
-
- field(cp, buf)
- {
- register c;
- register char *p, *q;
-
- p = cp;
- q = p+8;
- while((c = getc(buf)) != '\n') {
- if(c == ',' || c == ':' || c <= 0)
- break;
- if(p < q)
- *p++ = c;
- }
- *p = 0;
- peek = c;
- }
-
- value(buf)
- {
- register n, c;
-
- n = 0;
- while((c = getc(buf)) >= '0' && c <= '9')
- n = n*10 + c-'0';
- peek = c;
- return(n);
- }
-
- done()
- {
-
- setuid(getuid());
- execl("/bin/sh", "-", 0);
- exit();
- }
-