Annotation of researchv9/ipc/src/mgrs/dkmgr/dial.c, revision 1.1

1.1     ! root        1: #include <sys/types.h>
        !             2: #include <sys/stat.h>
        !             3: #include <sys/ioctl.h>
        !             4: #include <dk.h>
        !             5: #include <dkerr.h>
        !             6: #include <stdio.h>
        !             7: #include <signal.h>
        !             8: #include <errno.h>
        !             9: #include <ipc.h>
        !            10: #include <libc.h>
        !            11: #include "defs.h"
        !            12: #include <dkwindow.h>
        !            13: #include <sys/dkio.h>
        !            14: 
        !            15: /* imported */
        !            16: extern int     rdk_ld;
        !            17: extern int     dkp_ld;
        !            18: extern int     dt_ld;
        !            19: extern         int     errno;
        !            20: extern int unit;
        !            21: 
        !            22: 
        !            23: int
        !            24: net_dial(ip)
        !            25:        ipcinfo *ip;
        !            26: {
        !            27:        return dkdial(ip, 3);
        !            28: }
        !            29: 
        !            30: int
        !            31: net_announce(ip)
        !            32:        ipcinfo *ip;
        !            33: {
        !            34:        return dkdial(ip, 2);
        !            35: }
        !            36: 
        !            37: int
        !            38: dkdial(ip, serv)
        !            39:        ipcinfo *ip;
        !            40:        int serv;
        !            41: {
        !            42:        int fd;
        !            43:        int listener;
        !            44:        int i;
        !            45:        struct listenin d;
        !            46:        char dialstr[BUFSIZE];
        !            47:        char dialtone[2];
        !            48:        register char *dp, *cp;
        !            49:        struct stat st;
        !            50:        struct dialout reply;
        !            51:        int traffic=0;
        !            52: 
        !            53:        /* get type of request and properties */
        !            54:        for(dp = ip->param; *dp; dp++) {
        !            55:                for(;*dp && *dp==' '; dp++);
        !            56:                if (strncmp(dp, "heavy", 5)==0 && (dp[5]=='\0'||dp[5]==' '))
        !            57:                        traffic = 2;
        !            58:                for(;*dp && *dp!=' '; dp++);
        !            59:        }
        !            60: 
        !            61:        /* establish the initial connection */
        !            62:        fd = dkchan(traffic, unit);
        !            63:        if (fd < 0)
        !            64:                return ABORT(EBUSY, "out of output channels", NULLINFO);
        !            65:        dkproto(fd, dkp_ld);
        !            66:        ioctl(fd, FIOPUSHLD, &rdk_ld);
        !            67: 
        !            68:        /* set up the parameter block for the initial request */
        !            69:        fstat(fd, &st);
        !            70:        d.l_type = T_SRV;
        !            71:        d.l_lchan = minor(st.st_rdev);
        !            72:        d.l_srv = 256 - serv;
        !            73:        d.l_param0 = traffic;
        !            74:        d.l_param1 = 0;
        !            75:        d.l_param2 = 0;
        !            76:        d.l_param3 = 0;
        !            77:        d.l_param4 = 0;
        !            78:        d.l_param5 = 0;
        !            79: 
        !            80:        /*
        !            81:         * convert '!'s to '.'s .  escape all '.'s after the first '!'.
        !            82:         */
        !            83:        for(cp=ip->name, dp=dialstr; *cp; cp++)
        !            84:                if (*cp=='!'){
        !            85:                        *dp++ = '.';
        !            86:                        cp++;
        !            87:                        break;
        !            88:                } else
        !            89:                        *dp++ = *cp;
        !            90:        for(; *cp; cp++)
        !            91:                if (*cp=='!'){
        !            92:                        *dp++ = '.';
        !            93:                } else if (*cp=='.'){
        !            94:                        *dp++ = '\\';
        !            95:                        *dp++ = '.';
        !            96:                } else
        !            97:                        *dp++ = *cp;
        !            98:        *dp = '\0';
        !            99:        strcat(dialstr, "\n");
        !           100:        strcat(dialstr, ip->user);
        !           101:        strcat(dialstr, "\n");
        !           102:        listener = dkctlchan();
        !           103:        if (listener < 0)
        !           104:                return ABORT(errno,"can't get dk control channel",NULLINFO);
        !           105:        i = write(listener, (char *)&d, sizeof(d));
        !           106:        close(listener);
        !           107:        if (i != sizeof(d)) {
        !           108:                close(fd);
        !           109:                return ABORT(EIO, "can't dial out on dk", NULLINFO);
        !           110:        }
        !           111:        i = read(fd, dialtone, 1);
        !           112:        if (i < 0) {
        !           113:                close(fd);
        !           114:                return ABORT(EIO, "no dial tone from dk", NULLINFO);
        !           115:        }
        !           116:        if (dialtone[0] != 'O') {
        !           117:                close(fd);
        !           118:                return ABORT(EIO, "wrong dial tone from dk", NULLINFO);
        !           119:        }
        !           120:        ioctl(fd, DIOCSTOP, 0);
        !           121:        write(fd, dialstr, strlen(dialstr));
        !           122:        i = read(fd, (char *)&reply, sizeof reply);
        !           123:        if (i <= 0) {
        !           124:                close(fd);
        !           125:                return ABORT(EIO,"remote system doesn't respond",
        !           126:                                (ipcinfo *)NULL);
        !           127:        }
        !           128: 
        !           129:        /* successful reply, analyze it */
        !           130:        if (reply.srv!=D_OPEN) {
        !           131:                close(fd);
        !           132:                dktouerr(reply.param1&0x7f);
        !           133:                return -1;
        !           134:        }
        !           135:        if (dkproto(fd, dkp_ld) < 0) {
        !           136:                close(fd);
        !           137:                return ABORT(EIO, "can't push line discipline",NULLINFO);
        !           138:        }
        !           139:        if (W_VALID(reply.param4)) {    /* check window sizes */
        !           140:                char ws[5];
        !           141:                long wins = W_VALUE(reply.param4)>>2;
        !           142:                /* use 3 X wins/4 */
        !           143:                ws[0] = wins;
        !           144:                ws[1] = wins>>8;
        !           145:                ws[2] = wins>>16;
        !           146:                ws[3] = wins>>24;
        !           147:                ws[4] = 3;
        !           148:                ioctl(fd, DIOCXWIN, ws);
        !           149:        }
        !           150:        ioctl(fd, FIOPOPLD, 0);         /* dump rdk */
        !           151:        ip->myname = "who_knows";
        !           152:        return fd;
        !           153: }

unix.superglobalmegacorp.com

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