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

1.1     ! root        1: #include <stdio.h>
        !             2: #include <signal.h>
        !             3: #include <errno.h>
        !             4: #include <ipc.h>
        !             5: #include "defs.h"
        !             6: #include <sys/inet/tcp_user.h>
        !             7: #include <libc.h>
        !             8: #include <sys/param.h>
        !             9: #include <sys/ioctl.h>
        !            10: 
        !            11: #define CSPORT 1
        !            12: 
        !            13: /* imported */
        !            14: extern char *in_ntoa();
        !            15: extern int tcp_connect();
        !            16: extern int tcp_accept();
        !            17: extern int tcp_listen();
        !            18: extern char *in_host();
        !            19: extern in_addr in_address();
        !            20: extern int rmesg_ld;
        !            21: 
        !            22: /* dial a service on the internet - try first via cs, then direct */
        !            23: int
        !            24: net_dial(ip)
        !            25:        ipcinfo *ip;
        !            26: {
        !            27:        char *service;
        !            28:        struct tcpuser tu;
        !            29:        in_addr faddr;
        !            30:        int fd;
        !            31: 
        !            32:        /* parse the name */
        !            33:        service = strchr(ip->name, '!');
        !            34:        if (service != NULL)
        !            35:                *service++ = '\0';
        !            36:        else
        !            37:                return ABORT(ENOENT, "unassigned destination", NULLINFO);
        !            38:        faddr = in_address(ip->name);
        !            39:        if (faddr==INADDR_ANY)
        !            40:                return ABORT(ENOENT, "unassigned destination", NULLINFO);
        !            41: 
        !            42:        /* get a channel for the connection */
        !            43:        fd = tcp_sock();
        !            44:        if (fd < 0)
        !            45:                return ABORT(EBUSY, "out of output channels", NULLINFO);
        !            46: 
        !            47:        /* connect to the remote connection server */
        !            48:        tu.laddr = INADDR_ANY;
        !            49:        tu.lport = 0;
        !            50:        tu.faddr = faddr;
        !            51:        tu.fport = CSPORT;
        !            52:        tu.param = 0;
        !            53:        errstr = "destination not answering";
        !            54:        if (tcp_connect(fd, &tu)>=0) {
        !            55:                /* send the request */
        !            56:                ip->name = service;
        !            57:                if (_info_write(fd, ip)==0) {
        !            58:                        condition(fd, ip);
        !            59:                        if (_reply_read(fd)==0 && errno==0) {
        !            60:                                ip->myname = in_ntoa(tu.laddr);
        !            61:                                return fd;
        !            62:                        }
        !            63:                }
        !            64:        }
        !            65:        close(fd);
        !            66: 
        !            67:        /* no connection server, try the port directly */
        !            68:        fd = tcp_sock();
        !            69:        if (fd < 0)
        !            70:                return ABORT(EBUSY, "out of output channels", NULLINFO);
        !            71:        tu.laddr = INADDR_ANY;
        !            72:        tu.lport = 0;
        !            73:        tu.faddr = faddr;
        !            74:        tu.fport = fstotcp(service);
        !            75:        if (tu.fport<=0) {
        !            76:                close(fd);
        !            77:                return ABORT(ENOENT, errstr, NULLINFO);
        !            78:        }
        !            79:        tu.param = 0;
        !            80:        if (tcp_connect(fd, &tu)<0) {
        !            81:                close(fd);
        !            82:                return ABORT(ENOENT, errstr, NULLINFO);
        !            83:        }
        !            84:        condition(fd, ip);
        !            85:        ip->myname = in_ntoa(tu.laddr);
        !            86:        return fd;
        !            87: }
        !            88: 
        !            89: /* condition the connection as requested */
        !            90: condition(fd, ip)
        !            91:        int fd;
        !            92:        ipcinfo *ip;
        !            93: {
        !            94:        char *fields[10];
        !            95:        char param[128];
        !            96:        int i;
        !            97:        int dohup=0;
        !            98:        int domesg=0;
        !            99: 
        !           100:        strcpy(param, ip->param);
        !           101:        setfields(" \t");
        !           102:        getmfields(param, fields, 10);
        !           103:        for (i=0; i<10 && fields[i]; i++) {
        !           104:                if (strcmp(fields[i], "hup")==0)
        !           105:                        dohup = 1;
        !           106:                if (strcmp(fields[i], "delim")==0)
        !           107:                        domesg = 1;
        !           108:        }
        !           109:        if (dohup)
        !           110:                ioctl(fd, TCPIOHUP, 0);
        !           111:        if (domesg)
        !           112:                ioctl(fd, FIOPUSHLD, &rmesg_ld);
        !           113: }
        !           114: 
        !           115: /* announce onto the internet - only the first one gets there */
        !           116: int
        !           117: net_announce(ip)
        !           118:        ipcinfo *ip;
        !           119: {
        !           120:        int fd;
        !           121:        struct tcpuser tu;
        !           122: 
        !           123:        USE(ip);
        !           124:        fd = tcp_sock();
        !           125:        if (fd < 0)
        !           126:                return ABORT(EBUSY, "no more output channels", NULLINFO);
        !           127:        tu.lport = TCPPORT_ANY;
        !           128:        tu.laddr = 0;
        !           129:        tu.fport = 0;
        !           130:        tu.faddr = 0;
        !           131:        tu.param = 0;
        !           132:        if (tcp_listen(fd, &tu)<0) {
        !           133:                close(fd);
        !           134:                return ABORT(EEXIST, "server already exists", NULLINFO);
        !           135:        }
        !           136:        return fd;
        !           137: }
        !           138: 
        !           139: /* listen for a call in */
        !           140: ipcinfo *
        !           141: net_listen(fd)
        !           142:        int fd;
        !           143: {
        !           144:        static ipcinfo info;
        !           145:        static char myname[PATHLEN];
        !           146:        static char name[PATHLEN];
        !           147:        static char machine[PATHLEN];
        !           148:        struct tcpuser tu;
        !           149:        extern char *tcptofs();
        !           150: 
        !           151:        info.flags = 0;
        !           152:        for(;;) {
        !           153:                tu.param = 0;
        !           154:                if ((fd = tcp_accept(fd, &tu))<0)
        !           155:                        return NULL;
        !           156:                if (tu.lport == CSPORT) {
        !           157:                        if (tu.fport > 1023)
        !           158:                                info.uid = info.gid = -1;
        !           159:                        else
        !           160:                                info.uid = info.gid = 0;
        !           161:                        info.user = "_unknown_";
        !           162:                        if (_info_read(fd, &info)<0) {
        !           163:                                close(fd);
        !           164:                                return (ipcinfo *)NULL;
        !           165:                        }
        !           166:                        info.flags |= IPC_HANDOFF;
        !           167:                        condition(fd, &info);
        !           168:                } else {
        !           169:                        info.user = "_unknown_";
        !           170:                        info.param = "";
        !           171:                        strcpy(name, tcptofs(tu.lport));
        !           172:                        info.name = name;
        !           173:                }
        !           174:                strcpy(machine, in_host(tu.faddr));
        !           175:                info.machine = machine;
        !           176:                strcpy(myname, in_ntoa(tu.laddr));
        !           177:                info.myname = myname;
        !           178:                info.flags |= IPC_OPEN;
        !           179:                info.rfd = fd;
        !           180:                info.cfd = -1;
        !           181:                return &info;
        !           182:        }
        !           183: }
        !           184: 
        !           185: /* accept a call */
        !           186: void
        !           187: net_accept(ip)
        !           188:        ipcinfo *ip;
        !           189: {
        !           190:        USE(ip);
        !           191: }
        !           192: 
        !           193: /* reject a call - null if a non-cs call */
        !           194: void
        !           195: net_reject(ip, no, str)
        !           196:        ipcinfo *ip;
        !           197:        int no;
        !           198:        char *str;
        !           199: {
        !           200:        if (ip->flags&IPC_HANDOFF && ip->rfd>=0)
        !           201:                _reply_write(ip->rfd, no, str);
        !           202:        if (ip->rfd>=0) {
        !           203:                close(ip->rfd);
        !           204:                ip->rfd = -1;
        !           205:        }
        !           206: }

unix.superglobalmegacorp.com

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