Annotation of researchv8dc/cmd/inet/etc/rogind.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)rogind.c   4.18 83/07/01";
                      3: #endif
                      4: 
                      5: #include <stdio.h>
                      6: #include <sys/param.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: #include <errno.h>
                     10: #include <pwd.h>
                     11: #include <signal.h>
                     12: #include <sgtty.h>
                     13: #include <stdio.h>
                     14: #include <wait.h>
                     15: #include <sys/inet/in.h>
                     16: #include "config.h"
                     17: 
                     18: extern errno;
                     19: int    reapchild();
                     20: int    alrmcatch();
                     21: struct passwd *getpwnam();
                     22: struct passwd *pwd;
                     23: struct passwd nouser = {"", "nope", -1, -1, -1, "", "", "", "" };
                     24: char   *crypt(), *rindex(), *index(), *malloc();
                     25: extern char **environ;
                     26: char term[20] = "TERM=";
                     27: static char *envinit[] = {
                     28:        term,
                     29:        0
                     30: };
                     31: /*
                     32:  * remote login server:
                     33:  *     remuser\0
                     34:  *     locuser\0
                     35:  *     terminal type\0
                     36:  *     data
                     37:  */
                     38: main(argc, argv)
                     39:        int argc;
                     40:        char **argv;
                     41: {
                     42:        int f, dev;
                     43:        unsigned long faddr;
                     44:        int myport, fport;
                     45:        struct in_service *sp;
                     46: 
                     47:        sp = in_service("login", "tcp", 0);
                     48:        if(sp == 0){
                     49:                fprintf(stderr, "rogind: tcp/rogin: unknown service\n");
                     50:                exit(1);
                     51:        }
                     52:        myport = sp->port;
                     53:        close(3);
                     54:        signal(SIGPIPE, SIG_IGN);
                     55:        signal(SIGHUP, SIG_IGN);
                     56: 
                     57:        f = tcp_sock();
                     58:        if (f < 0) {
                     59:                perror("rogind: socket");
                     60:                exit(1);
                     61:        }
                     62:        signal(SIGCHLD, reapchild);
                     63:        signal(SIGALRM, alrmcatch);
                     64:        tcp_listen(f, myport, 0, 0);
                     65:        for (;;) {
                     66:                int s;
                     67: 
                     68:                s = tcp_accept(f, &faddr, &fport, &dev);
                     69:                if (s < 0) {
                     70:                        if (errno == EINTR)
                     71:                                continue;
                     72:                        perror("rogind: accept");
                     73:                        continue;
                     74:                }
                     75:                doit(s, faddr, fport, dev);
                     76:                close(s);
                     77:        }
                     78: }
                     79: 
                     80: reapchild()
                     81: {
                     82:        union wait status;
                     83:        int pid;
                     84: 
                     85:        signal(SIGCHLD, SIG_IGN);
                     86:        while((pid = wait3(&status, WNOHANG, 0)) > 0)
                     87:                rmut(pid);
                     88:        signal(SIGCHLD, reapchild);
                     89: }
                     90: 
                     91: char rusername[32], lusername[32];
                     92: char   buf[BUFSIZ];
                     93: int    child;
                     94: int    cleanup();
                     95: int    netf;
                     96: extern errno;
                     97: 
                     98: doit(f, faddr, fport, dev)
                     99:        int f;
                    100:        unsigned long faddr;
                    101: {
                    102:        extern tty_ld;
                    103:        extern char *ttyname();
                    104:        char c;
                    105:        int pid, ret;
                    106:        char *host, line[32];
                    107: 
                    108:        sprintf(line, "/dev/tcp%02d", dev);
                    109:        alarm(20);
                    110:        c = 1;
                    111:        read(f, &c, 1);
                    112:        alarm(0);
                    113:        if(c != 0){
                    114:                fprintf(stderr, "non-zero initial read from %x %d\n", faddr, fport);
                    115:                return;
                    116:        }
                    117:        host = (char *)in_host(faddr);
                    118:        if (host == 0) {
                    119:                msg(f, "Don't know your host name\n");
                    120:                fprintf(stderr, "didn't know his host name\n");
                    121:                return;
                    122:        }
                    123:        if(fport >= 1024){
                    124:                msg(f, "Permission denied\n");
                    125:                fprintf(stderr, "rogind: denied him permission\n");
                    126:                return;
                    127:        }
                    128:        if(access(line, 0) < 0){
                    129:                msg(f, "No tty\n");
                    130:                fprintf(stderr, "rogind: couldn't access line %s\n", line);
                    131:                return;
                    132:        }
                    133:        pid = fork();
                    134:        if (pid < 0){
                    135:                msg(f, "Fork problem\n");
                    136:                fprintf(stderr, "rogind: fork problen\n");
                    137:                return;
                    138:        }
                    139:        if (pid) {
                    140:                record(pid, line);
                    141:                return;
                    142:        }
                    143: 
                    144:        write(f, "", 1);
                    145: 
                    146:        signal(SIGCHLD, SIG_IGN);
                    147:        signal(SIGHUP, SIG_DFL);
                    148:        signal(SIGALRM, SIG_DFL);
                    149: 
                    150:        dup2(f, 0);
                    151:        dup2(f, 1);
                    152:        dup2(f, 2);
                    153:        dup2(0, 3);
                    154:        close(f);
                    155:        ioctl(0, TIOCSPGRP, 0);
                    156:        ioctl(0, TCPIOHUP, 0);
                    157: 
                    158:        environ = envinit;
                    159: 
                    160:        ret = doremotelogin(host);
                    161:        ioctl(0, FIOPUSHLD, &tty_ld);
                    162:        sttyek(0);
                    163:        if(ret < 0)
                    164:                execl(LOGIN, "login", 0);
                    165:        else
                    166:                execl(LOGIN, "login", "-f", pwd->pw_name, 0);
                    167:        printf("%s not found\n", LOGIN);
                    168:        exit(1);
                    169:        /*NOTREACHED*/
                    170: }
                    171: 
                    172: 
                    173: 
                    174: struct foo{
                    175:        int pid;
                    176:        char line[16];
                    177: };
                    178: #define NFOO 50
                    179: struct foo foo[NFOO];
                    180: 
                    181: record(pid, line)
                    182: char *line;
                    183: {
                    184:        int i;
                    185: 
                    186:        for(i = 0; i < NFOO; i++){
                    187:                if(foo[i].pid == 0){
                    188:                        foo[i].pid = pid;
                    189:                        strncpy(foo[i].line, line+5, 8);
                    190:                        return;
                    191:                }
                    192:        }
                    193: }
                    194: 
                    195: #include <utmp.h>
                    196: 
                    197: struct utmp wtmp;
                    198: char   wtmpf[] = "/usr/adm/wtmp";
                    199: char   utmp[] = UTMP;
                    200: #define SCPYN(a, b)    strncpy(a, b, sizeof(a))
                    201: #define SCMPN(a, b)    strncmp(a, b, sizeof(a))
                    202: 
                    203: rmut(pid)
                    204: {
                    205:        register f;
                    206:        int found = 0;
                    207:        char *line;
                    208:        int i;
                    209:        char file[32];
                    210: 
                    211:        for(i = 0; i < NFOO; i++){
                    212:                if(pid == foo[i].pid){
                    213:                        line = foo[i].line;
                    214:                        foo[i].pid = 0;
                    215:                        break;
                    216:                }
                    217:        }
                    218:        if(i >= NFOO)
                    219:                return;
                    220:        f = open(utmp, 2);
                    221:        if (f >= 0) {
                    222:                while(read(f, (char *)&wtmp, sizeof(wtmp)) == sizeof(wtmp)) {
                    223:                        if (SCMPN(wtmp.ut_line, line) || wtmp.ut_name[0]==0)
                    224:                                continue;
                    225:                        lseek(f, -(long)sizeof(wtmp), 1);
                    226:                        SCPYN(wtmp.ut_name, "");
                    227:                        time(&wtmp.ut_time);
                    228:                        write(f, (char *)&wtmp, sizeof(wtmp));
                    229:                        found++;
                    230:                }
                    231:                close(f);
                    232:        }
                    233:        if (found) {
                    234:                f = open(wtmpf, 1);
                    235:                if (f >= 0) {
                    236:                        SCPYN(wtmp.ut_line, line+5);
                    237:                        SCPYN(wtmp.ut_name, "");
                    238:                        time(&wtmp.ut_time);
                    239:                        lseek(f, (long)0, 2);
                    240:                        write(f, (char *)&wtmp, sizeof(wtmp));
                    241:                        close(f);
                    242:                }
                    243:        }
                    244:        sprintf(file, "/dev/%s", line);
                    245:        chmod(file, 0600);
                    246:        chown(file, 0, 0);
                    247: }
                    248: 
                    249: msg(fd, s)
                    250: char *s;
                    251: {
                    252:        write(fd, "\001", 1);
                    253:        write(fd, s, strlen(s));
                    254: }
                    255: 
                    256: alrmcatch()
                    257: {
                    258:        signal(SIGALRM, alrmcatch);
                    259:        return(-1);
                    260: }
                    261: 
                    262: sttyek(fd)
                    263: {
                    264:        struct sgttyb vec;
                    265: 
                    266:        gtty(fd, &vec);
                    267:        vec.sg_erase = '#';
                    268:        vec.sg_kill = '@';
                    269:        vec.sg_flags |= XTABS;
                    270:        stty(fd, &vec);
                    271: }
                    272: 
                    273: doremotelogin(host)
                    274:        char *host;
                    275: {
                    276:        FILE *hostf;
                    277:        int first = 1;
                    278:        char *p;
                    279: 
                    280:        getstr(rusername, sizeof (rusername), "remuser");
                    281:        getstr(lusername, sizeof (lusername), "locuser");
                    282:        getstr(term+5, sizeof(term)-5, "Terminal type");
                    283:        if(p = (char *)rindex(term, '/'))
                    284:                *p = '\0';
                    285:        if (getuid()) {
                    286:                pwd = &nouser;
                    287:                goto bad;
                    288:        }
                    289:        setpwent();
                    290:        pwd = getpwnam(lusername);
                    291:        endpwent();
                    292:        if (pwd == NULL) {
                    293:                pwd = &nouser;
                    294:                goto bad;
                    295:        }
                    296:        hostf = pwd->pw_uid ? fopen(EQUIV, "r") : 0;
                    297: again:
                    298:        if (hostf) {
                    299:                char ahost[32];
                    300: 
                    301:                while (fgets(ahost, sizeof (ahost), hostf)) {
                    302:                        char *user;
                    303: 
                    304:                        if ((user = index(ahost, '\n')) != 0)
                    305:                                *user++ = '\0';
                    306:                        if ((user = index(ahost, ' ')) != 0)
                    307:                                *user++ = '\0';
                    308:                        if (!strcmp(host, ahost) &&
                    309:                            !strcmp(rusername, user ? user : lusername)) {
                    310:                                fclose(hostf);
                    311:                                return (1);
                    312:                        }
                    313:                }
                    314:                fclose(hostf);
                    315:        }
                    316:        if (first == 1) {
                    317:                char *rhosts = ".rhosts";
                    318:                struct stat sbuf;
                    319: 
                    320:                first = 0;
                    321:                if (chdir(pwd->pw_dir) < 0)
                    322:                        goto again;
                    323:                if (lstat(rhosts, &sbuf) < 0)
                    324:                        goto again;
                    325:                if ((sbuf.st_mode & S_IFMT) == S_IFLNK) {
                    326:                        printf("login: .rhosts is a soft link.\r\n");
                    327:                        goto bad;
                    328:                }
                    329:                hostf = fopen(rhosts, "r");
                    330:                fstat(fileno(hostf), &sbuf);
                    331:                if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid) {
                    332:                        printf("login: Bad .rhosts ownership.\r\n");
                    333:                        fclose(hostf);
                    334:                        goto bad;
                    335:                }
                    336:                goto again;
                    337:        }
                    338: bad:
                    339:        return (-1);
                    340: }
                    341: 
                    342: getstr(buf, cnt, err)
                    343:        char *buf;
                    344:        int cnt;
                    345:        char *err;
                    346: {
                    347:        char c;
                    348: 
                    349:        do {
                    350:                if (read(0, &c, 1) != 1)
                    351:                        exit(1);
                    352:                if (--cnt < 0) {
                    353:                        printf("%s too long\r\n", err);
                    354:                        exit(1);
                    355:                }
                    356:                *buf++ = c;
                    357:        } while (c != 0);
                    358: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.