Annotation of researchv10no/ipc/bin/rogin.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * RLOGIN
                      3:  * Connect terminal to TCP/IP network
                      4:  * Operation is line-at-a-time with remote echo.
                      5:  */
                      6: #include <stdio.h>
                      7: #include <sys/param.h>
                      8: #include <sys/types.h>
                      9: #include <sgtty.h>
                     10: #include <signal.h>
                     11: #include <errno.h>
                     12: #include <pwd.h>
                     13: 
                     14: #define        CEOT    04
                     15: #define        NULL    0
                     16: 
                     17: 
                     18: struct sgttyb  locvec, savloc;
                     19: struct tchars savechars;
                     20: struct ltchars lsavechars;
                     21: struct ltchars nlchars = { -1, -1, -1, -1, -1, -1 };
                     22: 
                     23: int    rem;    /* remote descriptor */
                     24: int    rembit; /* 1<<rem; for select */
                     25: 
                     26: fd_set rdfd_set;
                     27: #define        NSELFD  (rem+1)
                     28: 
                     29: int    sigint();
                     30: 
                     31: char *mytty;
                     32: SIG_TYP savint, savquit;
                     33: char term[64] = "network";
                     34: 
                     35: intcatch(){    /* catch interrupts, turn them into rubouts */
                     36:        signal(SIGINT, intcatch);
                     37:        ioctl(rem, TIOCFLUSH, 0);
                     38:        write(rem, &savechars.t_intrc, 1);
                     39:        ioctl(rem, TIOCFLUSH, 0);
                     40:        ioctl(0, TIOCFLUSH, 0);
                     41:        FD_ZERO(rdfd_set);
                     42: }
                     43: 
                     44: quitcatch(){   /* catch quits, turn them into FS's */
                     45:        ioctl(0, TIOCFLUSH, 0);
                     46:        signal(SIGQUIT, quitcatch);
                     47:        write(rem, &savechars.t_quitc, 1);
                     48: }
                     49: 
                     50: main(argc,argv)
                     51:        char **argv;
                     52: {
                     53:        char *name=0, *host, *cp;
                     54:        struct passwd *pwd;
                     55:        extern struct passwd *getpwuid();
                     56: 
                     57:        ioctl(0, TIOCGETC, &savechars);
                     58:        ioctl(0, TIOCGLTC, &lsavechars);
                     59:        ioctl(0, TIOCGETP, &savloc);
                     60:        locvec = savloc;
                     61: 
                     62:        argv++, --argc;
                     63:        host = *argv++, --argc;
                     64: another:
                     65:        if (argc > 0 && !strcmp(*argv, "-l")) {
                     66:                argv++, argc--;
                     67:                if (argc == 0)
                     68:                        goto usage;
                     69:                name = *argv++; argc--;
                     70:                goto another;
                     71:        }
                     72:        if (host == 0)
                     73:                goto usage;
                     74:        if (argc > 0)
                     75:                goto usage;
                     76:        pwd = getpwuid(getuid());
                     77:        if (pwd == 0) {
                     78:                fprintf(stderr, "Who are you?\n");
                     79:                exit(1);
                     80:        }
                     81:        cp = (char *)getenv("TERM");
                     82:        if (cp)
                     83:                strcpy(term, cp);
                     84: 
                     85: 
                     86:        /*
                     87:         * request circuit to host.
                     88:         */
                     89:        rem = tcp_rcmd(host, "login", pwd->pw_name,
                     90:                name ? name : pwd->pw_name, term, 0);
                     91:        if (rem < 0) 
                     92:                exit(1);
                     93:        if(setuid(getuid()) < 0){
                     94:                perror("setuid");
                     95:                exit(1);
                     96:        }
                     97: 
                     98:        savint = signal(SIGINT, intcatch);
                     99:        savquit = signal(SIGQUIT, quitcatch);
                    100: 
                    101:        locvec.sg_flags &= ~(CRMOD|ECHO|XTABS);
                    102:        locvec.sg_flags |= CBREAK;
                    103:        ioctl(0, TIOCSETP, &locvec);
                    104:        ioctl(0, TIOCSLTC, &nlchars);
                    105: 
                    106: 
                    107:        /*
                    108:         * main loop.
                    109:         */
                    110:        do; while(scan() != -1);
                    111:        quit("select failed");
                    112:        /*NOTREACHED*/
                    113: usage:
                    114:        fprintf(stderr, "Usage: rogin host [-l user]\n");
                    115:        exit(1);
                    116: }
                    117: scan()
                    118: {
                    119:        extern errno;
                    120: 
                    121:        FD_ZERO(rdfd_set);
                    122:     Loop:
                    123:        FD_SET(0, rdfd_set);
                    124:        FD_SET(rem, rdfd_set);
                    125:        if(select(NSELFD, &rdfd_set, (fd_set *)0, 2000) == -1)
                    126:                if(errno == EINTR)
                    127:                        goto Loop;
                    128:                else
                    129:                        return -1;
                    130:        if(FD_ISSET(0, rdfd_set))
                    131:                keyboard();
                    132:        if(FD_ISSET(rem, rdfd_set))
                    133:                remote();
                    134:        return 0;
                    135: }
                    136: 
                    137: quit(s)
                    138:        char *s;
                    139: {
                    140:        printf("rogin: %s\n\r", s);
                    141:        ioctl(0, TIOCSETP, &savloc);
                    142:        ioctl(0, TIOCSLTC, &lsavechars);
                    143:        signal(SIGINT, SIG_DFL);
                    144:        ioctl(rem, TIOCFLUSH, 0);
                    145:        savloc.sg_ispeed = savloc.sg_ospeed = 0;        /* hangup */
                    146:        ioctl(rem, TIOCSETP, &savloc);
                    147:        close(rem);
                    148:        exit(strcmp(s, "eof"));
                    149: }
                    150: 
                    151: /*
                    152:  * Scan data from keyboard, looking for escape lines.
                    153:  */
                    154: keyboard()
                    155: {
                    156:        register c;
                    157:        register cc;
                    158:        register char *bp;
                    159:        register char *be, *obp;
                    160:        char buf[1024];
                    161:        static char line[128];
                    162:        static char *linep = &line[0];
                    163:        static col = 0;
                    164:        long time();
                    165: 
                    166:        cc = read(0, buf, sizeof buf);
                    167:        if(cc <0){
                    168:                if(errno == EINTR)
                    169:                        return;
                    170:        }
                    171:        if(cc <= 0)
                    172:                quit("read error on file descriptor 0");
                    173:        be = buf+cc;
                    174:        bp = obp = buf;
                    175:        while(bp < be) {
                    176:                c = *bp++;
                    177:                if (col==0 && c=='~') {
                    178:                        *linep++ = c;
                    179:                        col = 1;
                    180:                        locvec.sg_flags |= savloc.sg_flags&(CRMOD|ECHO);
                    181:                        ioctl(0, TIOCSETP, &locvec);
                    182:                        write(1, linep-1, 1);
                    183:                        continue;
                    184:                }
                    185:                col++;
                    186:                if (c=='\r')
                    187:                        c = '\n';
                    188:                if (linep>line) {
                    189:                        *linep++ = c;
                    190:                        if (c==savloc.sg_kill)
                    191:                                write(1, "\n", 1);
                    192:                        if (c==savloc.sg_erase)
                    193:                                linep -= 2;
                    194:                        if (c==savloc.sg_kill || linep<=line) {
                    195:                                linep = line;
                    196:                                locvec.sg_flags &= ~(CRMOD|ECHO);
                    197:                                ioctl(0, TIOCSETP, &locvec);
                    198:                                col = 0;
                    199:                                obp = bp;
                    200:                        }
                    201:                }
                    202:                if (c=='\n') {
                    203:                        col = 0;
                    204:                        if (linep > line) {
                    205:                                *linep = '\0';
                    206:                                if (escape(line+1))
                    207:                                        write(rem, line+1, linep-line-1);
                    208:                                obp = bp;
                    209:                                linep = line;
                    210:                                locvec.sg_flags &= ~(CRMOD|ECHO);
                    211:                                ioctl(0, TIOCSETP, &locvec);
                    212:                        }
                    213:                }
                    214:        }
                    215:        if (bp>obp && linep==line)
                    216:                if(write(rem, obp, bp-obp) <= 0)
                    217:                        quit("Eof");
                    218: }
                    219: 
                    220: /*
                    221:  * Send data from remote machine to standard output (trivial)
                    222:  */
                    223: remote(){
                    224:        char buf[1024];
                    225:        register n;
                    226: 
                    227:        n = read(rem, buf, sizeof buf);
                    228:        if(n < 0 && errno == EINTR)
                    229:                return;
                    230:        if(n <= 0)
                    231:                quit("Eof");
                    232:        write(1, buf, n);
                    233: }
                    234: 
                    235: escape(line)
                    236:        register char *line;
                    237: {
                    238: 
                    239:        switch(*line++) {
                    240:        case '!':
                    241:                cunix(line);
                    242:                return(0);
                    243: 
                    244:        case '.':
                    245:        case CEOT:
                    246:                quit("eof");
                    247: 
                    248:        case 'b':
                    249:                ioctl(rem, TIOCSBRK, 0);
                    250:                return(0);
                    251:        default:
                    252:                return(1);
                    253:        }
                    254: }
                    255: 
                    256: cunix(prog)
                    257: char *prog;
                    258: {
                    259:        register int upid;
                    260:        int retcode;
                    261: 
                    262:        if ((upid = fork()) == 0) {
                    263:                signal(SIGINT, savint);
                    264:                signal(SIGQUIT, savquit);
                    265:                ioctl(0, TIOCSETN, &savloc);
                    266:                ioctl(0, TIOCSLTC, &lsavechars);
                    267:                if (*prog == '\n')
                    268:                        execl("/bin/sh", "sh", "-i", 0);
                    269:                else
                    270:                        execl("/bin/sh","sh","-c",prog,0);
                    271:                exit(0100);
                    272:        }
                    273:        if (upid < 0) {
                    274:                printf("can't fork\n");
                    275:        } else {
                    276:                while((wait(&retcode) !=upid))
                    277:                        ;
                    278:        }
                    279:        signal(SIGINT, intcatch);
                    280:        signal(SIGQUIT, quitcatch);
                    281:        ioctl(0, TIOCSETN, &locvec);
                    282:        ioctl(0, TIOCSLTC, &nlchars);
                    283:        printf("!!\n");
                    284: }

unix.superglobalmegacorp.com

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