Annotation of researchv10no/ipc/mgrs/tcpmgr/tcp_lib.c, revision 1.1.1.1

1.1       root        1: #include "sys/inet/tcp_user.h"
                      2: /*
                      3:  * special debugging added to tcp_accept for tcpgate
                      4:  */
                      5: #include <ctype.h>
                      6: #include <stdio.h>
                      7: #include <errno.h>
                      8: extern errno;
                      9: extern char *errstr;
                     10: 
                     11: tcp_sock()
                     12: {
                     13:        int fd, n;
                     14:        char name[32];
                     15: 
                     16:        for(n = 01; n < 100; n += 2){
                     17:                sprintf(name, "/dev/tcp%02d", n);
                     18:                fd = open(name, 2);
                     19:                if(fd >= 0){
                     20:                        flabclr(fd);            /* for security unix */
                     21:                        return(fd);
                     22:                }
                     23:                if(errno != ENXIO)
                     24:                        break;
                     25:        }
                     26:        perror(name);
                     27:        return(-1);
                     28: }
                     29: 
                     30: static
                     31: tcp_rv(fd, tp)
                     32:        int fd;
                     33:        struct tcpuser *tp;
                     34: {
                     35:        int n;
                     36: 
                     37:        n = read(fd, (char *)tp, sizeof(struct tcpuser));
                     38:        if (n != sizeof(struct tcpuser)){
                     39:                if(errno==EINTR){
                     40:                        errstr = "timeout";
                     41:                } else {
                     42:                        errstr = "connection rejected";
                     43:                        errno = EACCES;
                     44:                }
                     45:                return -1;
                     46:        }
                     47: 
                     48:        switch(tp->code){
                     49:        case TCPC_OK:
                     50:                return 0;
                     51:        case TCPC_BADDEV:
                     52:                errstr = "tcp dev broken";
                     53:                errno = EIO;
                     54:                break;
                     55:        case TCPC_NOROUTE:
                     56:                errstr = "no route";
                     57:                errno = ENOENT;
                     58:                break;
                     59:        case TCPC_BADLOCAL:
                     60:                errstr = "invalid local address";
                     61:                errno = EINVAL;
                     62:                break;
                     63:        case TCPC_BOUND:
                     64:                errstr = "address(es) already in use";
                     65:                errno = ENOENT;
                     66:                break;
                     67:        default:
                     68:                errstr = "unknown error";
                     69:                errno = EIO;
                     70:                break;
                     71:        }
                     72:        return -1;
                     73: }
                     74: 
                     75: tcp_connect(fd, tp)
                     76:        int fd;
                     77:        struct tcpuser *tp;
                     78: {
                     79:        tp->code = TCPC_CONNECT;
                     80:        if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser)){
                     81:                errstr = "can't write tcp dev";
                     82:                return -1;
                     83:        }
                     84:        return tcp_rv(fd, tp);
                     85: }
                     86: 
                     87: tcp_listen(fd, tp)
                     88:        int fd;
                     89:        struct tcpuser *tp;
                     90: {
                     91:        tp->code = TCPC_LISTEN;
                     92:        if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser)){
                     93:                errstr = "can't write tcp dev";
                     94:                return -1;
                     95:        }
                     96:        return tcp_rv(fd, tp);
                     97: }
                     98: 
                     99: tcp_accept(fd, tp)
                    100:        int fd;
                    101:        struct tcpuser *tp;
                    102: {
                    103:        char name[128];
                    104:        int nfd;
                    105:        int n;
                    106: 
                    107:        if ((n=read(fd, (char *)tp, sizeof(struct tcpuser)))!=sizeof(struct tcpuser)) {
                    108:                logevent("accept: read %d, errno %d\n", n, errno);
                    109:                return -1;
                    110:        }
                    111:        if (tp->code != TCPC_OK) {
                    112:                logevent("accept: bad code %d\n", tp->code);
                    113:                return -1;
                    114:        }
                    115:        sprintf(name, "/dev/tcp%02d", tp->param);
                    116:        nfd = open(name, 2);
                    117:        if (nfd < 0)
                    118:                logevent("accept: can't open %s, errno %d\n", name, errno);
                    119:        if(nfd>=0)
                    120:                flabclr(nfd);           /* for security unix */
                    121:        return nfd;
                    122: }
                    123: 
                    124: tcp_rcmd(host, port, locuser, remuser, cmd, fd2p)
                    125: char *host, *port, *locuser, *remuser, *cmd;
                    126: int *fd2p;
                    127: {
                    128:        char buf[1];
                    129:        int fd;
                    130:        struct in_service *sp;
                    131:        struct tcpuser tu;
                    132:        in_addr in_address();
                    133: 
                    134:        tu.faddr = in_address(host);
                    135:        if(tu.faddr == 0){
                    136:                fprintf(stderr, "%s: unknown host\n", host);
                    137:                return(-1);
                    138:        }
                    139:        sp = in_service(port, "tcp", 0L);
                    140:        if(sp == 0){
                    141:                fprintf(stderr, "%s: unknown service\n", port);
                    142:                return(-1);
                    143:        }
                    144:        tu.fport = sp->port;
                    145:        fd = tcp_sock();
                    146:        if(fd < 0){
                    147:                perror(host);
                    148:                return(-1);
                    149:        }
                    150:        tu.laddr = INADDR_ANY;
                    151:        tu.lport = 0;
                    152:        tu.param = 0;
                    153:        if(tcp_connect(fd, &tu) < 0){
                    154:                fprintf(stderr, "%s: connection failed\n", host);
                    155:                goto bad;
                    156:        }
                    157: 
                    158:        if(fd2p == 0)
                    159:                write(fd, "", 1);
                    160:        else
                    161:                goto bad;       /* later */
                    162: 
                    163:        write(fd, locuser, strlen(locuser)+1);
                    164:        write(fd, remuser, strlen(remuser)+1);
                    165:        write(fd, cmd, strlen(cmd)+1);
                    166: 
                    167:        if(read(fd, buf, 1) != 1){
                    168:                perror(host);
                    169:                goto bad;
                    170:        }
                    171:        if(buf[0] != 0){
                    172:                while(read(fd, buf, 1) == 1){
                    173:                        write(2, buf, 1);
                    174:                        if(buf[0] == '\n')
                    175:                                break;
                    176:                }
                    177:                goto bad;
                    178:        }
                    179:        return(fd);
                    180: bad:
                    181:        close(fd);
                    182:        return(-1);
                    183: }

unix.superglobalmegacorp.com

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