Annotation of lucent/sys/src/9/boot/async.c, revision 1.1

1.1     ! root        1: #include <u.h>
        !             2: #include <libc.h>
        !             3: #include <../boot/boot.h>
        !             4: 
        !             5: static void    configasync(char*, char*);
        !             6: static void    connect(int, int);
        !             7: static void    kill(int);
        !             8: 
        !             9: void
        !            10: config9600(Method *mp)
        !            11: {
        !            12:        configasync("B9600", mp->arg);
        !            13: }
        !            14: 
        !            15: int
        !            16: auth9600(void)
        !            17: {
        !            18:        return dkauth();
        !            19: }
        !            20: 
        !            21: int
        !            22: connect9600(void)
        !            23: {
        !            24:        return dkconnect();
        !            25: }
        !            26: 
        !            27: void
        !            28: config19200(Method *mp)
        !            29: {
        !            30:        configasync("B19200", mp->arg);
        !            31: }
        !            32: 
        !            33: int
        !            34: auth19200(void)
        !            35: {
        !            36:        return dkauth();
        !            37: }
        !            38: 
        !            39: int
        !            40: connect19200(void)
        !            41: {
        !            42:        return dkconnect();
        !            43: }
        !            44: 
        !            45: 
        !            46: static void
        !            47: configasync(char *baud, char *dev)
        !            48: {
        !            49:        int cfd, dfd;
        !            50:        char devname[NAMELEN];
        !            51:        char eianame[NAMELEN];
        !            52:        char port[5];
        !            53: 
        !            54:        if(*sys == '/' || *sys == '#')
        !            55:                dev = sys;
        !            56:        else if(dev == 0)
        !            57:                dev = "#t/eia0";
        !            58:        if(readfile("#e/modemport", port, sizeof(port)) == 0){
        !            59:                sprint(devname, "#t/eia%d", atoi(port));
        !            60:                dev = devname;
        !            61:        }
        !            62:        sprint(eianame, "%sctl", dev);
        !            63:        cfd = open(eianame, ORDWR);
        !            64:        if(cfd < 0)
        !            65:                fatal(eianame);
        !            66:        sendmsg(cfd, baud);
        !            67: 
        !            68:        sprint(eianame, "%s", dev);
        !            69:        dfd = open(eianame, ORDWR);
        !            70:        if(dfd < 0)
        !            71:                fatal(eianame);
        !            72:        connect(dfd, cfd);
        !            73:        close(dfd);
        !            74:        sendmsg(cfd, "push async");
        !            75:        sendmsg(cfd, "push dkmux");
        !            76:        sendmsg(cfd, "config 1 16 restart dk 4");
        !            77:        close(cfd);
        !            78: }
        !            79: 
        !            80: enum
        !            81: {
        !            82:        CtrlD   = 0x4,
        !            83:        CtrlE   = 0x5,
        !            84:        CtrlO   = 0xf,
        !            85:        Cr      = 13,
        !            86:        View    = 0x80,
        !            87: };
        !            88: 
        !            89: static void
        !            90: connect(int fd, int cfd)
        !            91: {
        !            92:        char xbuf[128];
        !            93:        int i, pid, n, ctl;
        !            94: 
        !            95:        print("Connect to file system now, type ctrl-d when done.\n");
        !            96:        print("...(Use the view or down arrow key to send a break)\n");
        !            97:        print("...(Use ctrl-e to set even parity or ctrl-o for odd)\n");
        !            98: 
        !            99:        switch(pid = fork()) {
        !           100:        case -1:
        !           101:                fatal("fork failed");
        !           102:        case 0:
        !           103:                for(;;) {
        !           104:                        n = read(fd, xbuf, sizeof(xbuf));
        !           105:                        if(n < 0) {
        !           106:                                errstr(xbuf);
        !           107:                                print("[remote read error (%s)]\n", xbuf);
        !           108:                                for(;;);
        !           109:                        }
        !           110:                        for(i = 0; i < n; i++)
        !           111:                                if(xbuf[i] == Cr)
        !           112:                                        xbuf[i] = ' ';
        !           113:                        write(1, xbuf, n);
        !           114:                }
        !           115:                break;
        !           116:        default:
        !           117:                ctl = open("#c/consctl", OWRITE);
        !           118:                if(ctl < 0)
        !           119:                        fatal("opening consctl");
        !           120:                write(ctl, "rawon", 5);
        !           121: 
        !           122:                for(;;){
        !           123:                        read(0, xbuf, 1);
        !           124:                        switch(xbuf[0]&0xff) {
        !           125:                        case CtrlD:     /* done */
        !           126:                                kill(pid);
        !           127:                                close(ctl);
        !           128:                                return;
        !           129:                        case CtrlE:     /* set even parity */
        !           130:                                write(cfd, "pe", 2);
        !           131:                                break;
        !           132:                        case CtrlO:     /* set odd parity */
        !           133:                                write(cfd, "po", 2);
        !           134:                                break;
        !           135:                        case View:      /* send a break */
        !           136:                                write(cfd, "k250", 4);
        !           137:                                break;
        !           138:                        default:
        !           139:                                n = write(fd, xbuf, 1);
        !           140:                                if(n < 0) {
        !           141:                                        errstr(xbuf);
        !           142:                                        kill(pid);
        !           143:                                        close(ctl);
        !           144:                                        print("[remote write error (%s)]\n", xbuf);
        !           145:                                }
        !           146:                        }
        !           147:                }
        !           148:        }
        !           149: }
        !           150: 
        !           151: static void
        !           152: kill(int pid)
        !           153: {
        !           154:        char xbuf[32];
        !           155:        int f;
        !           156: 
        !           157:        sprint(xbuf, "#p/%d/note", pid);
        !           158:        f = open(xbuf, OWRITE);
        !           159:        write(f, "die", 3);
        !           160:        close(f);
        !           161: }

unix.superglobalmegacorp.com

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