Annotation of researchv9/ipc/src/servers/rshd.c, revision 1.1

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

unix.superglobalmegacorp.com

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