Annotation of researchv9/ipc/src/mgrs/svcmgr/gate.c, revision 1.1

1.1     ! root        1: #include "mgr.h"
        !             2: #include <errno.h>
        !             3: #include <sys/types.h>
        !             4: #include <sys/filio.h>
        !             5: 
        !             6: /*
        !             7:  *  Dial out to a gateway.  Return -1 if no more gates are to be tried.
        !             8:  *  Return 0 if more gates are to be tried.
        !             9:  */
        !            10: gateout(rp, ap)
        !            11:        Request *rp;
        !            12:        Action *ap;
        !            13: {
        !            14:        int fd;
        !            15:        extern int rmesg_ld;
        !            16: 
        !            17:        if (rp->i->cfd>=0) {
        !            18:                ipcreject(rp->i, EINVAL, "gate-through disallowed");
        !            19:                return -1;
        !            20:        }
        !            21: 
        !            22:        /* call `gateway' */
        !            23:        fd = ipcopen(ap->arg, rp->i->param);
        !            24: 
        !            25:        /* send original request */
        !            26:        if (fd<0 || _info_write(fd, rp->i)<0) {
        !            27:                /* if there are any more gateout's, keep trying */
        !            28:                if (ap->next==NULL)
        !            29:                        ipcreject(rp->i, errno, errstr);
        !            30:                close(fd);
        !            31:                return 0;
        !            32:        }
        !            33: 
        !            34:        /* see if the gateway could place the call */
        !            35:        if (_reply_read(fd)<0 || errno!=0 || ioctl(fd, FIOPUSHLD, &rmesg_ld)<0) {
        !            36:                /* call was rejected, don't try any more gateouts */
        !            37:                ipcreject(rp->i, errno, errstr);
        !            38:                close(fd);
        !            39:                return -1;
        !            40:        }
        !            41: 
        !            42:        /* gateway and call were accepted -- go for it */
        !            43:        ipcdaccept(rp->i, fd, "who_cares");
        !            44:        return -1;
        !            45: }
        !            46: 
        !            47: /*
        !            48:  *  Acccept a gateway call
        !            49:  */
        !            50: gateway(rp, ap)
        !            51:        Request *rp;
        !            52:        Action *ap;
        !            53: {
        !            54:        int caller, callee;
        !            55:        ipcinfo info;
        !            56:        fd_set fds;
        !            57:        char newname[ARB];
        !            58:        extern int mesg_ld;
        !            59:        char *mapuser();
        !            60: 
        !            61:        /* see if we gateway for this requestor */
        !            62:        if (mapuser(rp->s->name, rp->i->machine, rp->i->user)==NULL) {
        !            63:                ipcreject(rp->i, EACCES, "gateway disallowed");
        !            64:                return -1;
        !            65:        }
        !            66:        if ((caller=ipcaccept(rp->i))<0)
        !            67:                return -1;
        !            68: 
        !            69:        /* get the original request */
        !            70:        info.uid = info.gid = 0;
        !            71:        if (_info_read(caller, &info)<0)
        !            72:                return -1;
        !            73: 
        !            74:        /* dial the number */
        !            75:        sprintf(newname, "%s!%s", ap->arg, info.name);
        !            76:        info.name = newname;
        !            77:        info.rfd = info.cfd = -1;
        !            78:        info.flags = IPC_OPEN;
        !            79:        callee = ipcdial(&info);
        !            80:        if (callee<0 || ioctl(callee, FIOPUSHLD, &rmesg_ld)<0) {
        !            81:                _reply_write(caller, errno, errstr);
        !            82:                close(caller);
        !            83:                return -1;
        !            84:        }
        !            85: 
        !            86:        /* tell gateout that it worked */
        !            87:        if (_reply_write(caller, 0, "")<0) {
        !            88:                close(callee);
        !            89:                return -1;
        !            90:        }
        !            91: 
        !            92:        /* shuttle bytes back and forth */
        !            93:        FD_ZERO(fds);
        !            94:        for(;;) {
        !            95:                FD_SET(caller, fds);
        !            96:                FD_SET(callee, fds);
        !            97:                switch(select(NOFILE, &fds, (struct fd_set *)0, 1000)) {
        !            98:                case -1:
        !            99:                        return -1;
        !           100:                case 0:
        !           101:                        continue;
        !           102:                }
        !           103:                if (FD_ISSET(caller, fds))
        !           104:                        if (pass(caller, callee)<0)
        !           105:                                return -1;
        !           106:                if (FD_ISSET(callee, fds))
        !           107:                        if (pass(callee, caller)<0)
        !           108:                                return -1;
        !           109:        }
        !           110: }
        !           111: 
        !           112: pass(from, to)
        !           113:        int from, to;
        !           114: {
        !           115:        char buf[ARB];
        !           116:        int n;
        !           117: 
        !           118:        if ((n=read(from, buf, ARB))<=0)
        !           119:                return -1;
        !           120:        if (write(to, buf, n)!=n)
        !           121:                return -1;
        !           122:        return 0;
        !           123: }

unix.superglobalmegacorp.com

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